Professional Documents
Culture Documents
Algoritmi za sortiranje
Ana Zrnić (56/20)
1. Januar, 2021. - 3. Januar, 2021.
2 Implementacija algoritama
2.1 Generisanje nasumičnih brojeva i main funkcija
Prije nego što predemo na same algoritme moramo napraviti funkciju koja će generisati nasumične brojeve sa
kojima ćemo popuniti naš niz koji sortiramo. To ćemo uraditi koristeći rand funkciju koju ćemo prilagoditi
intervalu od 0 do 1000 na sljedeći način
1
Primjer 1 funkcija za generisanje nasumičnih brojeva
1 s t a t i c i n t r a n d b r ( i n t max)
2 {
3 i n t b r o j = rand ( )%max ; // o v a j n a c i n i m p l e m e n t a c i j e u v i j e k d a j e i n t e r v a l [ 0 , max)
4 return broj ;
5 }
Takode da izbjegnemo ponavljanje istih nasumičnih brojeva potrebno je na početku uključiti biblioteku
time.h, nakon toga main funkcija izgleda
Ovo je šablon koji ćemo koristiti za svaki algoritam, uz manuelne promjene varijable n od strane programera.
2
Primjer 4 način pozivanja funkcije
1 i n t main ( )
2 {
3 .
4 .
5 s e l e c t i o n s o r t ( n i z , n ) ; // p r o s l j e d j u j e m o n e s o r t i r a n n i z i n j e g o v e d i m e n z i j e
6 .
7 .
8 return 0;
9 }
3
2.4 Bubble sort
1. Vremenska složenost: O(n2 )
2. Potrošnja memorije: u mjestu
Bubble sort je prvi od predstavljenih gdje iz imena ne možemo naslutiti na koji način funkcioniše. Ideja je
da naši traženi elementi spremni za sortiranje ”isplivaju” na površinu tako što će porediti parove elemenata i
zamijeniti im mjesto ukoliko je to potrebno i svakim prolaskom počinje od nultog indeksa i ponavlja poredenja
dok više ne ispunjava uslov za poredenje. Smatran kao jedan od najsporijih algoritama za sortiranje, jer ima
mnogo prolazaka kroz kompletan niz.
Došli smo do prvog algoritma logaritamske vremenske složenosti, zaključak je da je ovo jedan od bržih
algoritama, kao i komplikovanije implementacije. Takode prvi put nailazimo na sortiranje koje se ne dešava
u mjestu već se koristi dodatna memorija. Ovo se dešava jer nam je za ovu metodu potreban pomoćni niz koji
4
je iste dužine kao i onaj koji upravo želimo sortirati, veoma očigledno iz ove postavke vidimo zašto je mjesto
sortiranja spoljašnje, za potrebe velikih dimenzija biće potrebno duplo prostora u memoriji da se sačuvaju
svi podaci. Algoritam funkcioniše rekurzivno poloveći niz u dva podniza dok ne dodemo do najprostijeg
slučaja kad imamo samo jedan element u podnizu. Tada se vraćamo unazad spajajući manje podnizove u
veće, prilikom čega ih sortiramo istovremeno. Potrebne su nam dvije funkcije, jedna koja polovi sam niz i
vrši rekurziju i druga koja vrši sortiranje i spajanje elemenata.
Ako već nije očigledno iz imena, vremenska složenost nam ukazuje brzinu ovog algoritma. Takode izbjega-
vanjem korištenja dodatne memorije vidimo u kojem slučaju je pogodniji u odnosu na merge sort. Jedan od
načina da se implementira ovaj algoritam je sljedeći: potrebno je proglasiti jedan nasumični element niza
pivotom (to je najčešće prvi element niza) na osnovu kojeg polovimo niz tako što ćemo lijevi dio niza (ili
desni) namijeniti za one elemente koji su manji od pivota i obrnuto za one koji su veći. Nakon toga se
5
elementi manji od pivota pomijeraju lijevo od pivota, a svi elementi veći od njega se postavljaju sa njegove
desne strane. Postupak se rekurzivno ponavlja za svaki od dva podniza (bez pivot elementa) dok ne dobijemo
sortiran niz.
Koje sve elemente moramo proslijediti funkciji? Kao što vidimo po prvom elementu koji je zapravo poka-
zivač, prosljedujemo željeni niz za sortiranje, zatim njegove dimenzije, i veličinu bajtova svakog elementa u
6
nizu, odnosno veličinu tipa podatka kojom smo deklarisali niz. Na samom kraju vidimo da je proslijedena
funkcija koja zahtijeva prenošenje dva elementa po njihovim adresama. Ova posljednja funkcija je ostavljena
programeru da je napiše, jer je ona ta koja odreduje zapravo sam kriterijum poredenja elemenata.
Primjer 14 pomoćna funkcija koja korisniku daje slobodu izbora kriterijuma poredenja
1 s t a t i c i n t cmpfunc ( i n t ∗ a , i n t ∗ b ) {
2 r e t u r n ∗b − ∗ a ; //u nasem s l u c a j u t o j e o p a d a j u c i poredak
3 }
3 Rezultati
Nakon što smo uveli svaki algoritam, preostalo je samo da uporedimo rezultate istih. Mjerenja su izvršena
koristeći dimenzije od 1000, 10000, 50000, 100000 i 150000 elemenata. Vrijeme izvršavanja je izraženo u
milisekundama.
7
3.3 Zaključak
Kako znati kada koristiti koji algoritam na osnovu svih prethodnih informacija?
Selection sort:
Merge sort:
• kada imamo dimenzije u blizini 2n (neki stepen broja 2)
• kod velikih nizova gdje nam je bitna brzina
• kada imamo dovoljno mjesta u radnoj memoriji da podržimo velike nizove, u suprotnom slučaju koristiti
merge
8
4 Izvori
D. Matić, Uvod u programiranje kroz programski jezik C, Prirodno – matematički fakultet u Banjoj Luci,
2018.
https://en.wikipedia.org/wiki/Sorting algorithmStability
https://en.wikipedia.org/wiki/Internal sort
https://www.tutorialspoint.com/c standard library/c function qsort.htm
https://www.geeksforgeeks.org/when-to-use-each-sorting-algorithms/