ˇki matematic ˇki list 5(2005), 21–28 Osjec

21

STUDENTSKA RUBRIKA

Sortiranje podataka
Alfonzo Baumgartner∗ Stjepan Poljak†

Saˇ zetak. Ovaj rad prikazuje jedno od rjeˇ senja problema sortiranja podataka u jednodimenzionalnom polju (nizu) elemenata. U praksi se ˇ cesto pojavljuje potreba za sortiranjem podataka te se zbog toga traˇ zi ˇ sto efikasniji i brˇ zi algoritam. U ovom radu detaljno je prikazan jedan od najboljih – merge-sort algoritam. Napravljene su i praktiˇ cne izvedbe algoritama za sortiranje koje su testirane na razliˇ citim skupovima podataka. Kljuˇ cne rijeˇ ci: algoritmi za sortiranje, merge-sort, rekurzivni algoritmi Data sorting Abstract. In this paper one solution of the problem of sorting an one-dimensional vector (array) of data is shown in this paper. A need for data sorting very often arises in the practice and therefore we are constantly searching for more efficient and faster sorting algorithms. One of the best sorting algorithms – merge-sort is shown in this paper in detail. We made two of sorting algorithms and tested them on different types of data. Key words: sorting algorithms, merge-sort, recursive algorithms

1. 1.1.

Uvod Nizovi kao strukture podataka

Jednodimenzionalno polje (niz) je linearna struktura podataka u koju moˇ zemo smjestiti viˇ se podataka istog tipa. Primjerice u programskom jeziku C, indeksiranje niza poˇ cinje od 0, tj. prvi element u nizu je na mjestu 0, a zadnji na mjestu N − 1, gdje je N duljina niza.
∗ Elektrotehniˇ cki Fakultet, Sveuˇ ciliˇ ste u Osijeku, Kneza Trpimira 2b, HR-31 000 Osijek, e-mail: baumgart@etfos.hr † Odjel za matematiku, Sveuˇ ciliˇ ste u Osijeku, Gajev trg 6, HR-31 000 Osijek, e-mail: spoljak@hotmail.com

) ili izvedeni. V [ i ] ) . 1. i n t N) { i f ( i >=N | | i < 0) r e t u r n . Ako su elementi niza med ¯usobno usporedivi. ime – ime niza. Rekurzivne funkcije Kako bi objasnili jedan od najboljih algoritama za sortiranje danas. N – konstanta. pa tako i primjerice C. imenom i svojom duljinom. p r i n t f ( ”%d \ n” . niz je potpuno definiran s gore navedenom trojkom: tipom. onda se takav niz elemenata moˇ ze sortirati. moramo se najprije upoznati s pojmom rekurzivnosti: Svaka funkcija koja unutar svoje definicije poziva samu sebe naziva se rekurzivna funkcija. tj. float.22 Alfonzo Baumgartner i Stjepan Poljak Slika 1. Prva naredba predstavlja nerekurzivni izlazak iz funkcije i osigurava ispravan rad. kopija takve funkcije u memoriji uvijek mora postojati i neki nerekurzivni put izlaska iz takve funkcije. a to znaˇ ci ako rijeˇ simo jedan problem. Sortirati znaˇ ci poredati elemente niza od najmanjeg do najve´ ceg. Op´ cenito. } Ova funkcija sastoji se od tri naredbe. “silazno”. N ) . Ve´ cina programskih jezika. Shematski prikaz niza u programskom jeziku C Ako ˇ zelimo koristiti niz. tj. Dan je i primjer jedne vrlo jednostavne rekurzivne funkcije. Primjer 1. i n t i . jednostavni (int. U ovom radu. tj.. Dva spomenuta naˇ cina sortiranja su dualni. tj. Rekurzivnim stablom moˇ zemo prikazati rad rekurzivne funkcije kako bi si lakˇ se predoˇ cili kako jedan rekurzivni algoritam zapravo funkcionira. Zato ´ cemo mi u ovom radu promatrati samo problem “uzlaznog” sortiranja.2. Kako ne bi doˇ slo do neograniˇ cenog broja poziva. Druga naredba ispisuje i-ti element niza . Rjeˇ senje: v o i d I s p i s ( i n t V [ ] . Napisati rekurzivnu C funkciju koja ´ ce ispisati niz od N cjelobrojnih podataka. podrˇ zava rekurzije kod funkcija. vrlo se lako dolazi i do rjeˇ senja drugoga. i +1 . gdje su: tip – tip podataka niza. niz je osnovna struktura podataka. I s p i s ( V . zadaje se kao i ime obiˇ cne varijable (skalara). char.. potrebna je i naredba deklaracije koja izgleda ovako: tip ime[N ]. “uzlazno” ili od najve´ ceg do najmanjeg. prirodni broj koji oznaˇ cava duljinu niza.

j ++) i f (V [ i ] >V [ j ] ) { t=V [ i ] . Selection-sort algoritam Ideja jednog od najjednostavnijih algoritama “selection-sort” se sastoji u sljede´ cem: u zadanom nizu prona´ ci svaki element koji je manji od onog koji se nalazi na prvom mjestu i ako je manji zamijeniti ga s tim elementom koji je na prvom mjestu. V [ i ]=V [ j ] . Sada lagano moˇ zemo izraˇ cunati broj ponavljanja Us : Us = (N − 1) + (N − 2) + · · · + 3 + 2 + 1 = N2 − N (N − 1)N = . 2 2 . Zadatak za vjeˇ zbu: ˇ sto se mijenja u radu ove funkcije ako zamijenimo mjesta drugoj i tre´ coj naredbi? 2. Znaˇ ci dobivamo poredan niz od najmanjeg elementa na prvom mjestu. tako da se nedavno doˇ slo do otkri´ ca algoritma “intro-sort” koji je kombinacija dvaju ve´ c poznatih algoritma za sortiranje. jer za neke sloˇ zenije tipove podataka usporedba je puno kompliciranija nego za neke jednostavnije tipove podataka. na´ ci nekakvu mjeru njegove brzine i odrediti o ˇ cemu ta brzina ovisi. Tako ´ cemo na kraju dobiti najmanji element na prvom mjestu. Vro je jednostavno ostvariti ovakav algoritam u bilo kojem programskom jeziku. Svaki sljede´ ci put imamo jedno ponavljanje manje. dok u najviˇ su klasu spadaju algoritmi poput “quick-sort” i “merge-sort”. gledat ´ cemo samo utjecaj duljine niza N . Evo jednog rjeˇ senja u programskom jeziku C: f o r ( i =0. Cilj ovog rada jest ukazati na razlike ovih dviju klasa algoritama. Analiza rada: Sada trebamo odrediti sloˇ zenost ovoga algoritma. U prvoj iteraciji vanjske petlje po brojaˇ cu i. dovoljno bi bilo u tre´ cem retku znak ‘>’ prebaciti u ‘<’. } Primjedba: lako je dobiti i algoritam koji sortira “silazno”. tj. ali i najsporiji algoritmi kao ˇ sto su to primjerice algoritami “bubble-sort” ili “selection-sort”. dok ´ ce na zadnjem mjestu ostati najve´ ci element.1. i ++) f o r ( j= i +1.Sortiranje podataka 23 na ekran. a sam je brˇ zi od svakog pojedinaˇ cno. Jasno je da duljina niza N ima presudan znaˇ caj. imamo N − 1 ponavljanja unutarnje petlje po brojaˇ cu j . dok je tre´ ca naredba rekurzivni poziv iste te funkcije i zbog toga je Ispis rekurzivna funkcija. Algoritmi za sortiranje U znanosti je problem sortiranja joˇ s uvijek aktualan i traˇ ze se bilo kakve mogu´ cnosti ubrzanja. a problem je sortirati elemente niza “uzlazno”. V [ j ]= t . U najniˇ zu klasu spadaju najjednostavniji. Nadalje. u ovoj jednostavnoj analizi. j <N . Kod svih ovih algoritama ulazni parametar je isti – niz V od N elemenata. Postupak se tako dalje ponavlja za preostale elemente od drugog do zadnjeg mjesta. i <N− 1. 2. Manji znaˇ caj ima i tip elemenata niza.

“kvadratne sloˇ zenosti”. drugi s predzadnjim itd.24 Alfonzo Baumgartner i Stjepan Poljak Ovu jednakost je lako dokazati ako zbrajamo prvi ˇ clan sume sa zadnjim. Vidjet ´ cemo i na praktiˇ cnim primjerima na kraju ovog rada kakav je znaˇ caj toga kvadrata na brzinu izvod ¯enja sortiranja. tj. tj. i n t n1=s +1 . od druge do ˇ cetvrte toˇ cke imamo razdvajanje niza V na lijevi V L i desni V D dio. Ne smijemo nikako zanemariti onaj N 2 koji smo dobili u brojniku rezultata.s) • Sort(VD. Vs } • Formiraj V D = {Vs+1 .d. 2. . nazovimo tako ovu klasu sporijih algoritama za sortiranje. Merge-sort algoritam Upotrijebljena je dobro poznata ideja “podijeli pa vladaj” na sljede´ ci naˇ cin: Niz V se podijeli na lijevi i desni dio otprilike po polovici. . .2. i n t d . iz funkcije . U sedmoj toˇ cki funkcije Sort nije detaljno opisan postupak spajanja lijevog i desnog dijela niza koji su ve´ c sortirani natrag u V . nakon toga se rekurzivno sortira posebno lijevi i posebno desni dio. i n t g ) { i f ( d==g ) r e t u r n . Naposlijetku. U petoj i ˇ sestoj toˇ cki imamo dva rekurzivna poziva iste funkcije samo s malo drugaˇ cijim parametrima. postupak spajanja ´ ce napraviti ostatak posla. Polovice duljine 1 se dalje ne raspolavljaju jer one ve´ c jesu sortirani nizovi. Rad algoritma se moˇ ze opisati ovako: niz se prepolovi. n2 . .g) • V=Merge(VL. sve dok se ne dod ¯e do niza duljine 1.g ) • ako je g − d <= 1 kraj • s= d +g 2 • Formiraj V L = {Vd . . merge) je sada jednostavno jer je lijevi i desni dio ve´ c sortiran. te se nakon toga niz ponovno spaja u jedan sortirani niz. . Vidjet ´ cemo da ni to ˇ sto se od tih N 2 oduzima N i to sve dijeli s dva ne pomaˇ ze puno. i f ( ( g−d)%2==1) n2=n1 . Prvu toˇ cku moˇ zemo opisati kao nerekurzivni izlazak iz funkcije. Postupak spajanja detaljno je opisan u sljede´ cem primjeru izvedbe “merge-sort” algoritma u programskom jeziku C: v o i d M er g eS o r t ( t i p p o d V [ ] . zakljuˇ cimo da je algoritam “selection-sort” tzv. // N e r e k u r z i v n i i z l a z a k i n t s = ( g−d ) / 2 .s+1. Spajanje (engl. pa se nakon toga i te polovice prepolove.VD) Sort je rekurzivna funkcija koja sortira niz V sa zadanom donjom granicom d i gornjom granicom g . e l s e n2=n1 − 1. i .d. . Osnovna ideja se moˇ ze malo detaljnije opisati sljede´ cim algoritmom: Sort(V . i dalje imamo ‘dosta spor’ algoritam. Vg } • Sort(VL. .

t i p p o d ∗VD = new t i p p o d [ n2 ] . e l s e V [ dg+i ++]=VD[ i 2 ++]. To se oˇ cigledno moˇ ze vidjeti iz gore navedenog primjera u C-u gdje se petlja ponavlja toˇ cno n1+ n2 puta. i 2 =0. i n t k . f o r ( k =0. . tj. f o r ( i =0.Sortiranje podataka 25 t i p p o d ∗ VL = new t i p p o d [ n1 ] . i ++) VL [ i ] = V [ d+i ] . M er g eS o r t ( VL . } } d e l e t e [ ] VL . i <n1 . // R e k u r z i v n i p o z i v ( S o r t i r a j l i j e v i d i o ) M er g eS o r t ( VD. pa sve do zadnjeg nivoa gdje se mogu na´ ci samo nizovi duljine 1. i ++) VD[ i ] = V [ d+i +s + 1 ] . i 1 =0 . i <n2 . d e l e t e [ ] VD . n1 −1 ) . // R e k u r z i v n i p o z i v ( S o r t i r a j d e s n i d i o ) // S p o j i VL i VD u j e d a n V . gdje su n1 i n2 redom duljine lijevog i desnog dijela bilo kojeg podniza zadanog niza V . } else { i f ( i 1 <n1 ) V [ dg+i ++]=VL [ i 1 ++]. k<n1+n2 . e l s e V [ dg+i ++]=VD[ i 2 ++]. kako odrediti ukupni broj ponavljanja kada imamo rekurzivnu funkciju?! To je op´ cenito teˇ zi problem. brzinu rada ovakvog algoritma. Prikaz rekurzivnog stabla koje generira rekurzivna funkcija MergeSort prilikom izvod ¯enja Rekurzivno stablo nam pomaˇ ze tako ˇ sto moˇ zemo utvrditi da se na svakom nivou stabla uvijek nalazi ukupno N elemenata niza bez obzira da li je niz V razbijen na 2 ili viˇ se dijelova. ( Merge ) i =0. ali u ovom sluˇ caju dosta ´ ce nam pomo´ ci rekurzivno stablo prikazano na Slici 2. Med ¯utim. n2 −1 ) . Najprije moramo re´ ci da dio koji spaja (merge) lijevi i desni dio ukupne duljine M napravi to u toˇ cno M ponavljanja. // R a s t a v i n i z V na l i j e v i i d e s n i d i o VL i VD f o r ( i =0. k++) { i f ( i 1 <n1 && i 2 <n2 ) { i f ( VL [ i 1 ] <VD[ i 2 ] ) V [ dg+ i ++]=VL [ i 1 ++]. } Analiza rada: Pokuˇ sajmo sada opet u terminima duljine niza N odrediti sloˇ zenost. 0 . Slika 2. 0 .

Ovisnost ukupnog broja ponavljanja o duljini niza N Sa Slike 3 jasno je vidljivo da su opisana dva algoritma usporediva samo za vrlo male vrijednosti N . 1 Testiranje je izvedeno na raˇ cunalu s procesorom Intel Pentium 4. Za ostale N analiza je malo kompliciranija. Lako se vidi da su oni sliˇ nizova N . Usporedimo sada ukupne brojeve ponavljanja za merge sort Um i za selection cnog reda veliˇ cine samo za dosta male duljine sort Us . za sve dulje nizove). . pa tako dobivamo konaˇ cno Um = N · log2 N . ali se dobije isti rezultat. Odnos ovih dviju veliˇ cina najbolje pokazuje Slika 3. Slika 3. pa imamo ukupni broj ponavljanja Um za “merge-sort” algoritam od Um = N · L.40GHz i RAM memorijom od 256MB. razlika postaje sve ve´ ca u korist Um (tj. teorijski rezultat jest da za svaki ve´ ci N uvijek trebamo koristiti “merge-sort” algoritam. 2. Mjereno je vrijeme1 izvod ¯enja za razliˇ cite duljine nizova N i dobiveni su rezultati prikazani u Tablicama 1 i 2. merge sort je brˇ zi).26 Alfonzo Baumgartner i Stjepan Poljak Ve´ c smo rekli da se svaka dva dijela moraju spajati u jedan ve´ ci i koliko to traje. Ovakvu klasu algoritama nazovimo “N log N ”. 3. Broj nivoa oznaˇ cen je s L. Lako se pokaˇ ze da ovisi i egzaktno se moˇ ze izraˇ cunati da je uvijek L = log2 N . za sve ve´ ce vrijednosti broja N (tj. Ova analiza rada je toˇ cna za svaki N koji je potencija broja 2. To znaˇ ci da po svakom nivou imamo najviˇ se N ponavljanja jer svi podnizovi skupa imaju najviˇ se N elemenata po nivou. med ¯utim. jer je viˇ sestruko brˇ zi. Ostaje nam joˇ s samo utvrditi ovisi li L o ukupnom broju elemenata u nizu N . Znaˇ ci. Eksperimentalni rezultati Na razliˇ citim tipovima podataka testirani su algoritmi “selection-sort” i “mergesort”.

ipak trebamo naposlijetku utvrditi da “merge-sort” ipak ima malo uve´ cane memorijske zahtjeve za razliku od “selection-sort” koji koristi samo zadani niz V . Zakljuˇ cak Iako je “selection-sort” algoritam naizgled puno jednostavniji. “heap-sort”. No. Taj uve´ cani memorijski zahtjev ipak nije toliko znaˇ cajan kolika je razlika u brzini izvod ¯enja ˇ sto se dobro vidi iz eksperimentalnih rezultata pogotovu za ve´ ce duljine niza N . “insert-sort”. Rezultati sortiranja realnih brojeva tipa float N tselection [ms] tmerge [ms] 1000 31 <1 2000 125 15 5000 719 15 10000 2453 16 20000 8391 32 50000 50297 109 100000 189140 234 200000 686500 516 500000 4286922 1469 Tablica 2. Ova dva algoritma nisu jedini koriˇ steni u praksi algoritmi za sortiranje. Rezultati sortiranja nizova znakova (rijeˇ ci) Na Slici 4 prikazani su dobiveni rezultati za sortiranje realnih brojeva (Tablica 1) grafiˇ cki. Algoritam “merge-sort” osim zbog svoje rekurzivnosti (sjetimo se da svaki rekurzivni poziv stvara novu kopiju te funkcije u memoriji sa svim njenim internim varijablama) unutar same funkcije stvara joˇ s jedan niz osim onog koji je doˇ sao kao parametar. .Sortiranje podataka 1000 16 <1 2000 47 <1 5000 219 15 10000 922 15 20000 3672 31 50000 22656 78 100000 86094 171 200000 299297 344 27 500000 1425812 922 N tselection [ms] tmerge [ms] Tablica 1. “quick-sort”. tu su joˇ s od poznatijih “bubble-sort”. ali su jako reprezentativni. “merge-sort” je puno efikasniji ˇ sto je pokazano u ovom radu i teorijski i eksperimentalno. Slika 4. Vidljivo je da ovi eksperimentalni rezultati odgovaraju teorijskim koji su analizirani u prethodnoj toˇ cki s prikazom na Slici 3. jer svi ostali zapravo spadaju u jednu od dvije klase sloˇ zenosti ovdje prezentirane (“kvadratna” i “N log N ” sloˇ zenost) ili im je brzina negdje “izmed ¯u”. Izmjereni rezultati izvrˇ savanja algoritama za sortiranje na nizovima realnih brojeva razliˇ cite duljine 4. Med ¯u ostalima.

Leiserson. Viˇ se o tome i sam algoritam moˇ ze se pogledati u [2]. Rivest. Introspective Sorting and Selection Algorithms. Naposlijetku. 1998. Sto smjeˇ staju u njih nadilazi tematiku ovoga rada pa ih ne´ cemo detaljnije objaˇ snjavati. Massachusetts: Addison-Wesley. Software – Practice and Experience (8)(1997). Second Edition. [2] D. Taj hibridni algoritam zapravo je kombinacija dvaju ve´ c poznatih “quick-sort” i “heapsort”. The Art of Computer Programming. a ne u ˇ su vezane liste i kako se podaci nizovima (jednodimenzionalnim poljima). Literatura [1] T. Ovdje navedeni “merge-sort” algoritam zapravo postiˇ ze joˇ s bolje rezultate kada su podaci smjeˇ steni u vezanim listama. 2nd edition. C. 2001. H. [3] D. R. E. Cormen. 123–164. Introduction to Algorithms. R. Reading. Sorting and Searching. Stein. Knuth.28 Alfonzo Baumgartner i Stjepan Poljak Najbrˇ zi danas koriˇ sten algoritam za sortiranje je “introspective-sort”. kada program detektira da se nekoliko puta za redom nailazi na loˇ s raspored elemenata za “quick-sort” i da bi u tom sluˇ caju doˇ slo do “kvadratnog” oˇ cekivanog vremena izvod ¯enja. . vezanim listama. C. spomenimo da podaci ne moraju biti uvijek smjeˇ steni u nizovima linearno u memoriji (znaˇ ci jedan iza drugoga) ve´ c mogu biti smjeˇ steni i u tzv. Massachusetts. on se prebacuje na “heap-sort” koji je tada bitno bolji. Naime. 983–993. a baˇ s o tome naˇ cinu smjeˇ stanja podataka takod ¯er ovisi odabir najboljeg algoritma za sortiranje. Musser. MIT Press. L.