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: