You are on page 1of 3

Bubble sort

Pored Insertion sorta, postoje jo mnogi drugi algoritmi za sortiranja niza elemenata. Jedan od jednostavnijih je tzv. Bubble sort. Ideju i nain rada Bubble sorta najprije emo opisati na primjeru a zatim emo algoritam zapisati egzaktno, u programskom jeziku C.

Ideja algoritma:
Pretpostavimo da na ulazu imamo sljedee polje od 6 elemenata 5, 3, 10, 2, 6, 4 koje elimo sortirati. U tu svrhu, prvo usporeujemo prvi element polja (broj 5) s drugim elementom (broj 3): Usporeivanje: 5, 3, 10, 2, 6, 4

Ukoliko je prvi usporeivani element vei od drugog (a u ovom sluaju jest), tada ta dva elementa meusobno zamijene svoja mjesta. U suprotnom se zamjena ne obavlja. Dakle, u naem sluaju, nakon zamjene dobivamo sljedeu situaciju: Nakon (eventualne) zamjene: 3, 5, 10, 2, 6, 4

Zatim se usporeuju drugi (5) i trei (10) element polja: Usporeivanje: 3, 5, 10, 2, 6, 4

No sada, budui da 5 nije manji od 10, ne obavljamo nikakvu zamjenu i situacija ostaje ista, tj.: Nakon (eventualne) zamjene: 3, 5, 10, 2, 6, 4

Ovaj postupak nastavljamo dalje usporeujui trei element sa etvrtim i vrei zamjenu u sluaju da je trei bio manji od etvrtog, zatim etvrti element sa petim, ... itd. i na koncu pretposljednji element s posljednjim. U naem sluaju, rad algoritma nastavio bi se ovako: Usporeivanje: Nakon (eventualne) zamjene: Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje : Nakon (eventualne) zamjene: 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 10, 2, 6, 4 2, 10, 6, 4 2, 10, 6, 4 2, 6, 10, 4 2, 6, 10, 4 2, 6, 4, 10

to vidimo nakon ovog prvog "prolaza" kroz polje? Vidimo da je meusobnim usporedbama susjednih elemenata i njihovim eventualnim zamjenama najvei element polja (broj 10) "isplivao" na svoje pravo mjesto (na kraj niza). Dakle, njegovo mjesto u nizu je odreeno. Sada "skraujemo" niz za jedan element i ponavljamo ponovno gornji postupak usporeivanja, ponovno poinjui od prvog elementa polja. Algoritam nastavlja ovako (oznakom | odvojili smo nae "skraeno" polje od ostatka koji nas vie ne zanima i koji se zapravo ve sortiran): Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje: Nakon (eventualne) zamjene: Usporeivanje : Nakon (eventualne) zamjene: 3, 3, 3, 3, 3, 3, 3, 3, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 4, 4 4 4 4 4 4 4 6 | | | | | | | | 10 10 10 10 10 10 10 10

Nakon ovog kruga zamjena opet je (ali ovaj put u "skraenom" polju, bez elementa 10) na njegov kraj doao najvei element (broj 6). Sada ponovo skraujemo polje (jer, elementi 6 i 10 su na svojim pravim mjestima pa vie nema potrebe baviti se njima) i zapoinjemo novi krug zamjena: Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje : 3, 2, 2, 2, 2, 2, 3, 3, 3, 3, 5, 5, 5, 5, 4, 4 4 4 4 5 | | | | | 6, 6, 6, 6, 6, 10 10 10 10 10

Element 5 doao je nakon ovog kruga zamjena na svoje pravo mjesto, pa opet skraujemo polje za jedan element i zapoinjemo novi krug usporedbi: Usporeivanje : Nakon (eventualne) zamjene: Usporeivanje : 2, 3, 4 2, 3, 4 2, 3, 4 | 5, 6, 10 | 5, 6, 10 | 5, 6, 10

Vidimo da u ovom krugu ni jednom nismo morali zamijeniti neka dva elementa. To znai da je niz sortiran, pa algoritam zavrava s radom.

Implementacija u C-u:
Funkcija bubble_sort kao ulazne parametre uzima: polje cijelih brojeva koje elimo sortirati, cijeli broj koji predstavlja duinu ulaznog polja.

Kada funkcija zavri s radom, ulazno polje bit e uzlazno sortirano.

void bubble_sort(int a[], int n) { int imali_smo_bar_jednu_zamjenu; do { imali_smo_bar_jednu_zamjenu = 0; for(int i = 0; i < n - 1; i++) { if (a[i] > a[i + 1]) { int pomocni = a[i]; a[i] = a[i + 1]; a[i + 1] = pomocni; } } n--;

/* zamijeni dva */ /* susjedna */ /* elementa */

imali_smo_bar_jednu_zamjenu = 1;

/* skrati polje za jedan element */ } while (imali_smo_bar_jednu_zamjenu != 0); }

Zadaci za vjebu
Zadatak 1: Prouiti funkciju bubble_sort i shvatiti kako ona radi. Zadatak 2: Napisati program koji nam omoguuje da unesemo polje od 10 cijelih brojeva. Uneseno polje treba sortirati pomou Bubble sorta i zatim ga, tako sortiranog, ispisati. Zadatak 3: Promijeniti funkciju bubble_sort tako da se ulazno polje sortira silazno (a ne uzlazno, kao to je to sada sluaj). Zadatak 4: Odrediti vrijeme izvravanja funkcije bubble_sort za najgori i najbolji sluaj i usporediti ta vremena s odgovarajuim vremenima za Insertion Sort.