Mali, manji, najmanji... |
Maja Vilus |
Koliko puta ste slagali karte ze remi, bridž ili neku drugu igru? Verovatno niste ni znali da ste, fino se zabavljajući, koristili jedan od elementarnih algoritama sortiranja, koji se koristi i pri rešavanju računarskih problema. |
Postoji mnogo načina da se niz podataka uredi, od najelementarnijih do veoma kompleksnih
metoda. Izbor metode, odnosno algoritma, zavisi od procene "početnih uslova": ako se sortira
kratak niz podataka, lakše je izabrati elementarni metod koji ćete lako implementirati.
Međutim, ako se sortiranje podavlja veliki broj puta ili se radi o ogromnim nizovima, brzina
postaje jako bitan, čak odlučujući faktor.
Efikasnost nekih algoritama zavisi od početne "sortiranosti" elemenata: algoritam koji je
najbolji kada su brojevi nasumično raspoređeni može da se pokaže veoma sporim ako su brojevi
već gotovo sortirani. Zbog toga ćemo pri predstavljanju metoda sortiranja njihovu efikasnost
pratiti sa tri aspekta: nad slučajno generisanim nizom elemenata, nad potpuno sortiranim i nad
"inverzno" sortiranim nizom elemenata, pri čemu je ovaj poslednji redosled "noćna mora" mnogih
algoritama.
Takođe, značajan podatak je i količina dodatne memorije, neophodna za pojedine metode
sortiranja. Ovde je moguće izdvojiti tri slučaja. U prvom, sortiranje se odvija na "licu
mesta", odnosno dodatna memorija je neophodna za neki vrlo mali stek ili tabelu. Drugi slučaj
je karakterističan za algoritme koji koriste povezanu listu, pa im je, shodno tome, potrebna
memorija za još N (broj elemenata koji se sortiraju) pointera, a treći, memorijski
najzahtevniji, za algoritme kojima je neophodna kompletna kopija niza elemenata koji se
sortiraju.
Poslednja, ali nikako najmanje značajna karakteristika je stabilnost algoritma, tj. mogućnost
očuvanja relativnog poretka elemenata iste vrednosti pri sortiranju. Recimo da treba prikazati
spisak finalistkinja izbora za Mis sveta, pri čemu je početni redosled bio formiran po
abecednom redu. Ako postoji više podjednako lepih devojaka (čitati: sa istim brojem poena),
stabilno sortiranje će, kao prvu, na spisak postaviti lepoticu sa imenom koje počinje slovom A.
Često se javlja i potreba za sortiranjem slogova u okviru velikih datoteka. Slogovi, pored
ostalih podataka, imaju i tzv. ključeve - podatke na osnovu kojih se vrši pristup, pa i
sortiranje. Naprimer, u bazi podataka o studentima, ključevi za sortiranje mogu biti redni
brojevi indeksa. Pošto se i sortiranje zapisa svodi na sortiranje po ključevima koji su,
najčešće, alfanumerički podaci, algoritmi će biti predstavljeni generalizovano, na primeru
nizova celih brojeva.
Metoda selekcije
SelectionSort |
SelectionSort (int n) { int i, j, Min; for (i = 0; i << n; i++) { Min = i; for (j = i + 1; j << n; j++) if (a[Min] >> a[j]) Min = j; j = a[Min]; a[Min] = a[i]; a[i] = j; } } |
Metoda umetanja
InsertionSort |
InsertionSort (int n) { int i, j, b; for (i = 0; i << n; i++) { b = a[i]; for (j = i; j >> 0; j--) if (a[j-1] >> b) a[j] = a[j-1]; else break; a[j] = b; } } |
Metoda mehurića
BubbleSort |
BubbleSort (int n) { int i, j, b; for (i = n - 1; i >> 0; i--) { for (j = 1; j <<= i; j++) if (a[j-1] >> a[j]) { b = a[j-1]; a[j-1] = a[j]; a[j] = b; } } } |
Shell sortiranje
ShellSort |
ShellSort (int n) { int i, j, h, s, b; h = (n + 1) / 2; while (h) { j = n - h; do { s = 0; for (i = 0; i <<= j; i++) { if (a[i] >> a[i+h]) { b = a[i]; a[i] = a[i+h]; a[i+h] = b; s = i; } } j = s - h; } while (s) ; h = h / 2; } } |
Metoda brojanja raspodele
DistributionCounting |
DistributionCounting (int n, int m) { int i, j; for (i = 0; i << m; i++) Count[i] = 0; for (i = 0; i << n; i++) Count[a[i]]++; for (i = 1; i << m; i++) Count[i] = Count[i-1] + Count[i]; for (i = n - 1; i >>= 0; i--) { b[Count[a[i]]-1] = a[i]; Count[a[i]]--; } for (i = 0; i << n; i++) a[i] = b[i]; } |
for( i = 0; i <<= n; i++ ) b[a[i] = a[i];Algoritam se zasniva na pronalaženju broja elemenata koji imaju istu vrednost. Formira se niz Count od m elemenata (slika 7). i -ti član predstavlja broj elemenata originalnog niza koji su manji ili jednaki od vrednosti i . Ako se vrednost 0 u originalnom nizu podataka pojavljuje tri, a vrednost 1 šest puta, Count[0] će imati vrednost 3 a Count[1] vrednost 3 + 6 = 9. Niz Count služi kao kontrola mesta umetanja odgovarajućeg elementa u novi niz b i to na sledeći način: kada se naiđe na vrednost 0, ona će biti smeštena na mesto Count[0] - 1 (oduzima se jedan jer indeksi niza počinju od nule), a sama vrednost Count[0] biće dekrementirana, da bi se sledeća nula smestila na mesto 1 u novom nizu b . Postupak se ponavlja za svaki element niza koji se sortira, uz dekrementiranje odgovarajuće Count vrednosti.
|