Bubble Lajittele algoritmi Java: Taulukon lajitteluohjelma ja esimerkki

⚡ Älykäs yhteenveto

Bubble Lajittele algoritmi Java vertaa toistuvasti vierekkäisiä taulukon alkioita ja vaihtaa niitä, kunnes sekvenssi on järjestyksessä. Tässä artikkelissa selitetään toimintamekanismi, pseudokoodi, täydellinen Java toteutus, optimoitu variantti, monimutkaisuusanalyysi ja käytännön vertailut muihin lajittelutekniikoihin.

  • 🔄 Keskeinen periaate: Vertaa jokaista vierekkäistä paria ja vaihda paikkoja, kun vasen arvo ylittää oikean arvon, siirtämällä suurin elementti kunkin läpimenon loppuun.
  • 🧮 Passin rakenne: n alkion taulukko tarvitsee enintään n-1 käsittelykertaa, ja jokainen käsittelykerta lyhentää lajittelematonta aluetta yhdellä sijainnilla.
  • ☕ Java toteutus: Kaksi sisäkkäistä for-silmukkaa ja väliaikainen muuttuja suorittavat vaihdon, eikä ylimääräistä taulukon allokointia tarvita.
  • ⚡ Optimointitekniikka: Boolen vaihdettu lippu lopettaa ulomman silmukan ennenaikaisesti, mikä lyhentää parhaan tapauksen kvadraattisesta lineaariseen aikaan.
  • ⏱️ Monimutkaisuusprofiili: Huonoin ja keskimääräinen aika on O(n²), paras tapaus on O(n) optimoituna ja aputila pysyy arvossa O(1).
  • 🇧🇷 Algoritmien vertailu: Pikalajittelu ja kekolajittelu suoriutuvat paremmin Bubble Lajittele suuria tietojoukkoja, mutta BubblLajittelu pysyy vakaana.
  • 🎯 Käytännön käyttö: Valita BubblLajittele opetusta varten, pieniksi taulukoiksi tai lähes lajitelluksi dataksi.

Bubble Lajittele algoritmi Java

Mikä on Bubble Lajittele?

Bubble Sort on yksinkertainen vertailuun perustuva lajittelualgoritmi, joka vertaa taulukon ensimmäistä alkiota seuraavaan. Jos taulukon nykyinen alkio on numeerisesti suurempi kuin seuraava, alkiot vaihdetaan. Samoin algoritmi käy läpi koko taulukon alkion.

Algoritmi on saanut nimensä siitä, miten lajittelemattoman alueen suurin arvo nousee tasaisesti lopulliseen sijaintiinsa, aivan kuten kupla nousee veden pintaan. Ensimmäisen täydellisen läpimenon jälkeen suurin elementti täyttää viimeisen indeksin. Toisen läpimenon jälkeen toiseksi suurin elementti lukitaan paikalleen, ja prosessi toistuu, kunnes taulukko on täysin järjestetty.

Tässä artikkelissa luomme Java ohjelma toteuttaa Bubble Lajittele. Tarkista koodin tuloste, joka auttaa sinua ymmärtämään ohjelman logiikkaa, ja tarkastele sitten optimoitua versiota ja sitä seuraavaa monimutkaisuusanalyysia.

Miten BubblToimiiko lajittelualgoritmi?

BubblLajittelu toimii toistuvien läpikäyntien avulla taulukon läpi. Jokainen läpikäynti kulkee ensimmäisestä indeksistä parhaillaan lajittelemattoman alueen loppuun, vertaa vierekkäisiä arvoja ja vaihtaaping ne aina, kun ne esiintyvät väärässä järjestyksessä. Koska suurin jäljellä oleva arvo siirtyy aina lajittelemattoman alueen oikeaan reunaan, alue kutistuu täsmälleen yhden pykälän jokaisen kierroksen jälkeen.

Koko prosessi voidaan jakaa neljään toistettavaan vaiheeseen:

  1. Vertailla: Vertaile indeksin j-1 alkiota indeksin j alkioon verrattuna.
  2. Vaihtaa: Jos vasen elementti on suurempi kuin oikea elementti, vaihda kahden arvon arvot käyttämällä väliaikaista muuttujaa.
  3. Advance: Siirrä yksi sijainti oikealle ja toista, kunnes lajittelemattoman alueen loppu on saavutettu.
  4. Toistaa: Aloita uusi suoritus yhden elementin lyhyemmästä alueesta ja lopeta n-1 suorituksen jälkeen tai kun suoritus ei suorita vaihtoja.

Alla oleva taulukko tracon esimerkkitaulukko {860, 8, 200, 9}, jota käytetään ohjelmassa myöhemmin tällä sivulla. Se näyttää tarkalleen, mikä arvo asettuu lopulliseen asemaansa jokaisen läpimenon lopussa.

Siirtää Taulukko reitin alussa Suoritetut vertailut Matriisi passin lopussa Elementti lukittu
1 860, 8, 200, 9 3 8, 200, 9, 860 860
2 8, 200, 9, 860 2 8, 9, 200, 860 200
3 8, 9, 200, 860 1 8, 9, 200, 860 9
4 8, 9, 200, 860 0 8, 9, 200, 860 8

Huomaa, että kolmannella kierroksella suoritetaan vertailu, mutta ei vaihtoa. Optimoitu toteutus havaitsee tämän ehdon ja pysähtyy välittömästi, mikä on arvokkain yksittäinen parannus, jonka voit soveltaa tähän algoritmiin.

Bubble Lajittelualgoritmi Pseudokoodi

Ennen kirjoittamista Java syntaksin osalta se auttaa ilmaisemaan logiikan kielineutraalilla pseudokoodilla. Alla oleva versio sisältää varhaisen poistumisen lipun, joten se kattaa sekä klassisen että optimoidun toiminnan.

procedure bubbleSort(array A, integer n)
    for i from 0 to n - 2 do
        swapped := false
        for j from 1 to n - i - 1 do
            // compare the adjacent pair
            if A[j - 1] > A[j] then
                swap A[j - 1] and A[j]
                swapped := true
            end if
        end for
        // no swap in a full pass means the array is sorted
        if swapped = false then
            break
        end if
    end for
end procedure

Ulompi silmukka kontrolloi läpimenojen määrää ja sisempi silmukka kontrolloi yhden läpimenon sisällä tapahtuvia vertailuja. Sisemmän silmukan yläraja on n – i – 1, koska viimeiset i paikkaa pitävät jo lopulliset arvonsa hallussaan.

Java Toteutettava ohjelma Bubble Lajittele

Seuraava ohjelma lajittelee kokonaislukutaulukon nousevaan järjestykseen. Ylimääräiset tulostuslausekkeet on jätetty silmukoiden sisään tarkoituksella, koska pass-by-pass-lausekkeiden lukeminen trace on nopein tapa aloittelijalle ymmärtää, miten swapit kertyvät.

package com.guru99;

public class BubbleSort {

    public static void main(String[] args)
    {
        int arr[] = {860, 8, 200, 9};

        System.out.println("---Array BEFORE Bubble Sort---");

        printArray(arr);

        bubbleSort(arr); //sorting array elements using bubble sort

        System.out.println("---Array AFTER Bubble Sort---");

        printArray(arr);

    }

    static void bubbleSort(int[] array)
    {
        int n = array.length;
        int temp = 0;
        for(int i = 0; i < n; i++) // Looping through the array length
        {   System.out.println("Sort Pass Number " + (i + 1));
            for(int j = 1; j < (n - i); j++)
            {
                System.out.println("Comparing " + array[j - 1] + " and " + array[j]);
                if(array[j - 1] > array[j])
                {
                    //swap elements
                    temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                    System.out.println(array[j] + " is greater than " + array[j - 1]);
                    System.out.println("Swapping Elements: New Array After Swap");
                    printArray(array);
                }

            }
        }

    }

    static void printArray(int[] array){

        for(int i = 0; i < array.length; i++)
        {
            System.out.print(array[i] + " ");
        }
        System.out.println();

    }
}

lähtö:

---Array BEFORE Bubble Sort---
860 8 200 9
Sort Pass Number 1
Comparing 860 and 8
860 is greater than 8
Swapping Elements: New Array After Swap
8 860 200 9
Comparing 860 and 200
860 is greater than 200
Swapping Elements: New Array After Swap
8 200 860 9
Comparing 860 and 9
860 is greater than 9
Swapping Elements: New Array After Swap
8 200 9 860
Sort Pass Number 2
Comparing 8 and 200
Comparing 200 and 9
200 is greater than 9
Swapping Elements: New Array After Swap
8 9 200 860
Sort Pass Number 3
Comparing 8 and 9
Sort Pass Number 4
---Array AFTER Bubble Sort---
8 9 200 860

Code selitys: kuplalajittelu metodi vastaanottaa taulukon viitteenä, joten kutsuja näkee lajitellun tuloksen ilman paluuarvoa. temp säilyttää yhden arvon kolmen rivinvaihdon aikana, minkä vuoksi algoritmi tarvitsee vain O(1) lisämuistia. Lauseke n – i sisemmässä silmukassa ehto takaa, että jo lajiteltuja sijainteja häntässä ei koskaan palata.

optimoitu Bubble Lajittele ohjelma Java

Yllä oleva ohjelma suorittaa aina n-1 läpimenoa, vaikka taulukko lajiteltaisiin aikaisin. Yhden totuusarvon lipun lisääminen korjaa tämän tehottomuuden. Jos täydellinen läpimeno päättyy ilman yhtäkään vaihtoa, taulukon lajittelu on taattua ja ulompi silmukka voi pysähtyä välittömästi.

package com.guru99;

public class OptimizedBubbleSort {

    public static void main(String[] args) {
        int arr[] = {5, 12, 33, 47, 58};
        bubbleSort(arr);
        System.out.println(java.util.Arrays.toString(arr));
    }

    static void bubbleSort(int[] array) {
        int n = array.length;
        int passes = 0;
        for (int i = 0; i < n - 1; i++) {
            boolean swapped = false;
            for (int j = 1; j < n - i; j++) {
                if (array[j - 1] > array[j]) {
                    int temp = array[j - 1];
                    array[j - 1] = array[j];
                    array[j] = temp;
                    swapped = true;
                }
            }
            passes++;
            // Early exit: the array is already sorted
            if (!swapped) {
                break;
            }
        }
        System.out.println("Passes executed: " + passes);
    }
}

lähtö:

Passes executed: 1
[5, 12, 33, 47, 58]

Syötetaulukko oli jo lajiteltu, joten optimoitu versio valmistui yhden käsittelykerran jälkeen neljän sijaan. Lähes lajitellulla datalla tämä muutos muuttaa neliöllisen työmäärän lähes lineaariseksi, mikä on pääsyy Bubble Sort esiintyy edelleen ajoittain oikeassa koodissa.

Aikakompleksisuus ja tilakompleksisuus Bubble Lajittele

Kompleksisuus kuvaa, miten suoritusaika kasvaa syötteen koon kasvaessa. BubblLajittele optimoimattomassa versiossa vertailujen lukumääräksi on kiinteä n(n-1)/2, mikä sijoittaa sen vahvasti toisen asteen luokkaan.

skenaario Syöttöehto Ajan monimutkaisuus Avaruuden monimutkaisuus
Paras tapaus Taulukko on jo lajiteltu, optimoitu versio O (n) O (1)
Keskimääräinen tapaus Elementit satunnaisessa järjestyksessä O(n²) O (1)
Pahimmassa tapauksessa Käänteisessä järjestyksessä lajiteltu taulukko O(n²) O (1)

Koska jokainen vaihto tapahtuu alkuperäisen taulukon sisällä ja käytetään vain yhtä väliaikaista muuttujaa, Bubble Sort on paikallinen algoritmi, jossa on O(1) aputilaa. Se on myös stabiili lajittelu, mikä tarkoittaa, että kaksi samaa avainta sisältävää tietuetta säilyttävät alkuperäisen suhteellisen järjestyksensä lajittelun jälkeen.

Edut ja haitat Bubble Lajittele

Molempien puolien ymmärtäminen auttaa sinua päättämään, milloin algoritmi on hyväksyttävä valinta ja milloin se tulisi korvata.

edut

  • Yksinkertaisuus: Logiikka mahtuu noin kymmenelle riville, mikä helpottaa kirjoittamista oikein haastatteluolosuhteissa.
  • Paikan päällä tapahtuva toiminta: Apumatriisia ei ole allokoitu, joten muistin käyttö ei kasva syötteen koon mukana.
  • vakaus: Yhtäsuuruiset avaimet säilyttävät alkuperäisen järjestyksensä, millä on merkitystä lajiteltaessa tietueita toissijaisen kentän mukaan.
  • Varhainen poistumisen havaitseminen: Vaihdettu lippu tunnistaa jo lajitellun taulukon yhdellä kertaa.

Haitat

  • Neliöllinen kasvu: 10 000 elementin lajittelu vaatii pahimmassa tapauksessa lähes 50 miljoonaa vertailua.
  • Ylimääräinen kirjoittaa: Algoritmi suorittaa paljon enemmän vaihtoja kuin valintalajittelu, joka on muistia kuluttavaa hitaiden kirjoitustoimintojen vuoksi.
  • Huono skaalautuvuus: Tuotantotyökuormat suosivat lähes aina Quicksort-, Merge Sort- tai sisäänrakennettua Arrays.sort-metodia.

💡 Vinkki: Tuotannossa Java koodi, mieluiten Arrays.sort() alkukantaisille ja Kokoelmat.sort() listoille. Molemmat käyttävät tarkasti viritettyjä algoritmeja, Dual-Pivot Quicksortia ja TimSortia, jotka toimivat paremmin kuin käsin kirjoitettu Bubble Lajittele suuruusluokkien mukaan.

Bubble-lajittelu vs. muu lajittelu Algorithms

Alla oleva taulukko vertaa BubblLajittele aloittelijoiden seuraavaksi kohtaamilla lajittelutekniikoilla, jotta näet tarkalleen, missä kukin voittaa.

algoritmi Paras tapaus Keskimääräinen kotelo Pahimmassa tapauksessa Tila Vakaa
Bubble Lajittele O (n) O(n²) O(n²) O (1) Kyllä
Valinta Lajittele O(n²) O(n²) O(n²) O (1) Ei
Lisäyslajittelu O (n) O(n²) O(n²) O (1) Kyllä
Pikavalinta O (n log n) O (n log n) O(n²) O (log n) Ei
Keon lajittelu O (n log n) O (n log n) O (n log n) O (1) Ei

BubblLajittelulla ja lisäyslajittelulla on sama lineaarinen paras tapaus, mutta lisäyslajittelu suorittaa vähemmän vaihtoja osittain lajitellulle datalle. Valintalajittelu suorittaa aina täsmälleen n-1 vaihtoa, mikä tekee siitätracaktiivinen, kun kirjoittaminen on kallista, vaikkakin se heikentää vakautta. Muutaman sadan alkion taulukoille pikalajittelu tai kekolajittelu on oikea valinta.

Kun olet tottunut tässä käytettyihin taulukon läpikäymismalleihin, sama silmukkarakenne esiintyy monissa klassisissa harjoituksissa, kuten Fibonaccin sarja Java ja Java palindromiohjelma. Revnäkeminen Java taulukot ja sitä leveämpi Java oppitunti vahvistaa tämän algoritmin perusperiaatteita.

UKK

Nimi heijastaa arvojen liikettä jokaisen läpikulun aikana. Suurin jäljellä oleva elementti liikkuu tasaisesti kohti taulukon loppua, samalla tavalla kuin veden läpi nouseva kupla, kunnes se saavuttaa pinnan.

Enintään n-1 läpikäyntiä tarvitaan, mikä tuottaa n(n-1)/2 vertailua. Vaihdettujen lippujen optimoinnilla lajiteltu taulukko viimeistellään yhdellä läpikäynnillä, koska läpikäynnin aikana ei tapahdu vaihtoa.

Reverse vertailuoperaattori sisemmän silmukan sisällä. Muuta jos (taulukko[j-1] > taulukko[j]) että jos (taulukko[j-1] < taulukko[j])Ohjelman jokainen muu rivi pysyy muuttumattomana.

Kyllä. Korvaa suurempi kuin -operaattori operaattorilla vertaa() merkkijonoarvoille tai Comparator-kutsulla mukautetuille objekteille. Ympäröivän silmukan rakenne ja swap-logiikka pysyvät ennallaan.

Kyllä. Tekoälyavustajat tuottavat luotettavasti työtehtäviä BubblLajittele koodi, koska kaava on erittäin yleinen harjoitusdatassa. Tarkista aina silmukan rajat ja testaa käänteisillä ja kaksoisarvoilla ennen kuin luotat tulosteeseen.

Kyllä. Haastattelijat käyttävät sitä edelleen silmukkapäättelyn ja monimutkaisuusanalyysin testaamiseen. Algoritmin ymmärtäminen antaa myös mahdollisuuden arvioida, onko tekoälyn luoma lajittelukoodi tehokasta eikä pelkästään toiminnallista.

Tiivistä tämä viesti seuraavasti: