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.

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:
- Vertailla: Vertaile indeksin j-1 alkiota indeksin j alkioon verrattuna.
- Vaihtaa: Jos vasen elementti on suurempi kuin oikea elementti, vaihda kahden arvon arvot kรคyttรคmรคllรค vรคliaikaista muuttujaa.
- Advance: Siirrรค yksi sijainti oikealle ja toista, kunnes lajittelemattoman alueen loppu on saavutettu.
- 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.
