22
VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA BLACE SEMINARSKI RAD ALGORITMI I STRUKTURE PODATAKA TEMA: METODE SORTIRANJA, UNUTRAŠNJE I SPOLJAŠNJE MENTOR:Dr. Branislav STUDENT:Miladinović

Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

  • Upload
    zoxim

  • View
    361

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

VISOKA POSLOVNA ŠKOLA STRUKOVNIH STUDIJA BLACE

SEMINARSKI RAD

ALGORITMI I STRUKTURE PODATAKA

TEMA: METODE SORTIRANJA, UNUTRAŠNJE I SPOLJAŠNJE

MENTOR:Dr. Branislav Jevtović STUDENT:Miladinović Slobodan

Br. ind. 04/08 III

Septembar 2010

Page 2: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

Sadržaj

Sortiranje po adresi ......................................................................................... 3

Sortiranje poređenjem ..................................................................................... 4

Metodi umetanja .............................................................................................. 5

Metodi selekcije .............................................................................................. 6

Heapsort .......................................................................................................... 7

Metodi zamene ................................................................................................ 8

Particijsko sortiranje ........................................................................................ 9

Opšta procena performansi metoda sortiranja poređenjem ........................... 10

Metodi sortiranja linearne složenosti .............................................................11

Primena principa sortiranja ............................................................................13

Literatura ....................................................................................................... 14

2

Page 3: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

Unutrašnje sortiranje se primenjuje na skupove podataka čija veličina dozvoljava da se svi podaci istovremeno nalaze u operativnoj memoriji. Najčešće su podaci smešteni u vidu jednog vektora, pa se svakom podatku može direktno pristupiti. Zato se unutrašnje sortiranje često naziva i sortiranjem nizova. Ponekad se niz podataka može predstaviti i ulančanom listom, ali tada podacima mora da se pristupa sekvencijalno, pa je ovakvo sortiranje generalno sporije. Zato se u daljem izlaganju, ako drugačije nije naglašeno, smatra da su podaci koji se sortiraju smešteni u nizu a[1], ..., a[n].

Kako je jedan od zahteva pri sortiranju efikasno korišćenje prostora, sa ovog aspekta poželjni su algoritmi koji vrše sortiranje in situ (na mestu), koristeći prostor gde je smešten neuređeni niz uz još samo konstantan broj dodatnih pomoćnih lokacija nezavisan od broja podataka. Još važniji je kriterijum vremenske složenosti kao pokazatelja performansi ovih metoda. Uobičajeni indikatori performanse metoda unutrašnjeg sortiranja u zavisnosti od broja podataka n koji se sortiraju su:

broj koraka algoritma da bi se došlo do rešenja,

broj poređenja ključeva (C),

broj premeštanja zapisa (M).

Većina metoda u radu podrazumeva premeštanje zapisa sa jednog mesta na drugo da bi se oni konačno doveli u uređeni poredak. Međutim, kod većih zapisa ovo može biti vremenski skupo i može se izbeći po cenu malog dodatnog prostora. Jedan način je sortiranje po adresi što podrazumeva korišćenje pomoćnog vektora koji sadrži pokazivače na zapise (slika 12.1a). Sada je dovoljno premeštati pokazivače u pomoćnom vektoru umesto samih zapisa, a krajnji poredak, prikazan na slici 12.1b, je određen upravo vektorom pokazivača i na osnovu njega se zapisi mogu konačno i fizički premestiti.

2 3R 1

4 8 1 5 3 7R 2 R 3 R 4

k ey 2 3R 1

4 8 1 5 3 7R 2 R 3 R 4

k ey

a ) b )

Slika 12.1 Sortiranje po adresi – stanje pokazivača: a) pre sortiranja i b) posle sortiranja

Drugi način je ulančavanje zapisa između sebe u listu bez njihovog premeštanja. Tada svaki zapis treba da ima i dodatno polje link koje ukazuje na zapis sa sledećom vrednošću ključa, kao i spoljašnji pokazivač first koji pokazuje na zapis sa najmanjim (ili najvećim) ključem (slika 12.2). Ovde se potreba za premeštanjem izbegava prevezivanjem liste bez fizičkog pomeranja zapisa.

3

Page 4: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

2 3R 1

4 8 1 5 3 7R 2 R 3 R 4

k ey

lin k

firs t

Slika 12.2 Sortiranje prevezivanjem pokazivača

Postoji više pristupa problemu unutrašnjeg sortiranja, sa mnogo varijanti algoritama različite složenosti i ostalih karakteristika. Najopštiji način za sortiranje je međusobno upoređivanje podataka po ključu, pa se ova grupa metoda naziva sortiranje poređenjem. Pokazuje se da su najbolje performanse kod ovih metoda u srednjem i najgorem slučaju ograničene na O(n log n). Postoji, takođe, i jedan manji broj metoda koji nisu zasnovani na međusobnom poređenju ključeva, već se zasnivaju na nekim specifičnim karakteristikama ključeva, a mogu da postignu i linearnu složenost O(n). Posle izlaganja obe grupe metoda i razmatranja njihovih reprezentativnih tehnika, na kraju se daje opšte poređenje metoda unutrašnjeg sortiranja.

Sortiranje poređenjemSvi metodi ovoga tipa su zasnovani isključivo na međusobnom poređenju

vrednosti ključeva odgovarajućih zapisa koji se sortiraju. Glavni pristupi se mogu svrstati u četiri grupe: metodi umetanja, metodi selekcije, metodi zamene i metodi spajanja. Prve tri grupe se razmatraju u ovoj glavi, a metodi spajanja, iako mogu da se koriste i za unutrašnje sortiranje, predstavljaju skoro isključivi način sortiranja podataka na spoljašnjim uređajima, pa se zato razmatraju u narednoj glavi. U izlaganju u okviru svake grupe se postupno počinje sa direktnim metodima. Ovi metodi dobro odslikavaju osnovne principe, jer su jednostavni, kratki i laki za razumevanje. Pomenute prednosti se plaćaju slabijim performansama, pa tako za velike skupove podataka treba koristiti složenije, ali efikasnije algoritme. Međutim, za male skupove podataka njihove prednosti ne dolaze do izražaja, pa su to slučajevi gde se direktni metodi primenjuju.

Metodi umetanja

Ova grupa metoda se zasniva na principu postepenog uređivanja niza, tako što se u svakom trenutku održava uređeni i neuređeni deo. U svakom koraku se uzima jedan element iz neuređenog dela i umeće na odgovarajuće mesto u uređenom delu, koji na taj način raste. Predstavnici ove grupe metoda su: direktno umetanje i umetanje sa smanjenjem inkrementa.

Direktno umetanje

Osnovni princip se najbolje odslikava u metodu direktnog umetanja. U početku se uređeni deo sastoji samo od prvog elementa niza, a u neuređeni deo spadaju svi ostali elementi. Neka se posle i - 1 koraka u uređenom delu nalaze

4

Page 5: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodanelementi a1 ... ai-1. Tada se u koraku i uzima prvi element iz neuređenog dela ai i ubacuje na mesto koje mu po neopadajućem poretku odgovara u uređenom delu,

čime se ovaj deo povećava za jedan element. Sortiranje se završava kad nema više elemenata u neuređenom delu. Direktno umetanje je ilustrovano po koracima za dati skup ključeva na slici 12.3. Algoritam za sortiranje direktnim umetanjem je realizovan procedurom INSERTION-SORT. Ulaz u proceduru predstavlja neuređeni niz ključeva a[1:n], koji ona na kraju napravi uređenim.

U svakoj iteraciji u okviru unutrašnje petlje uzima se tekući element kao prvi element iz neuređenog dela, pa se upoređuje redom sa elementima uređenog dela, prvo sa poslednjim, pa sa pretposlednjim, itd., sve dok se ne naiđe na prvi element u uređenom delu koji nije veći od tekućeg elementa. Pritom se elementi uređenog dela koji su veći od tekućeg elementa pomeraju za po jedno mesto naviše i tako prave mesto za njegovo umetanje. Metod je stabilan jer kad ključ koji se umeće dođe do jednakog ključa u uređenom delu, on se stavlja neposredno iza njega.

Implementacija gornjeg algoritma može da se učini i efikasnijom tako što se pre sortiranja stavi graničnik u a[0] čija vrednost odgovara minimalnom ključu u nizu. Tada nema potrebe da se u unutrašnjoj petlji proverava da li je j veće od nule, jer tekući element onda ne može da ide dalje od pozicije a[1].

Umetanje sa smanjenjem inkrementa

Pokazuje se da veliki broj premeštanja u metodu direktnog spajanja dolazi zbog činjenice da se premeštaju samo susedni elementi, tako da element koji se umeće mora da pomeri u proseku oko n/3 ostalih. Bolji rezultati bi se mogli očekivati ako se umesto kratkih koraka omoguće skokovi na većoj distanci. Značajno poboljšanje u ovom smeru u odnosu na direktno umetanje predložio je Shell u metodu koji se naziva umetanje sa smanjenjem inkrementa ili shellsort.

Algoritam sortiranja sa smanjenjem inkrementa je realizovan procedurom SHELL-SORT. Pored pretpostavke, kao i ranije, da se podaci za sortiranje nalaze u nizu a[1:n], ovde se pretpostavlja da se vrednosti inkremenata nalaze u nizu h[1:t].

Nije sasvim očigledno zašto ovaj metod ima bolje performanse, kad svaki korak, za razliku od direktnog umetanja, čak radi sa svim elementima u nizu. Ranije je naglašeno da direktno umetanje (koje se koristi za sortiranje grupa) ima veoma dobre performanse ako je broj podataka mali i ako je niz dosta dobro uređen. Upravo se to dešava u ovom postupku. Na početku je inkrement h veliki, pa su grupe male. Pokazuje se da svaki kasniji korak zadržava uređenost iz prethodnog koraka i još je povećava, što znači da hi+1-sortiran niz ostaje i hi-sortiran. Prema tome, u kasnijim koracima kad se grupe povećaju, one su već dosta uređene kao rezultat prethodnih koraka, pa se stvaraju uslovi za efikasniji rad direktnog umetanja u okviru grupe. Na primer, u drugom koraku druga grupa od četiri elementa (27, 57, 75, 96) je već potpuno uređena, pa nema potrebne ni za kakvim premeštanjem u okviru nje.

Metodi selekcije

Osnovna strategija ove grupe metoda je da se u svakom koraku izabere po jedan najmanji (ili najveći) element iz grupe preostalih neuređenih elemenata. Ova

5

Page 6: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

operacija se naziva fazom selekcije. Da bi se selekcija optimizovala, neki metodi prvo vrše prethodno procesiranje neuređenog niza generišući pogodne strukture podataka koje ovaj izbor čine vrlo efikasnim. Generisanje ovih struktura praktično

znači organizaciju prioritetnog reda, pa se iz njega u fazi selekcije izvlače redom elementi i tako dobija njihov uređen poredak. Tipični primeri iz grupe metoda selekcije su: direktna selekcija, sortiranje pomoću binarnog stabla i heapsort.

Direktna selekcija

Osnovni i najjednostavniji metod iz ove grupe je direktna selekcija. Naziv je sasvim odgovarajući jer nema nikakvog prethodnog procesiranja neuređenog niza, već se odmah vrši neposredna selekcija elemenata. Kao i kod direktnog umetanja, i ovde se tokom rada algoritma održava uređeni i neuređeni deo niza. U početku čitav niz je neuređeni deo. Zatim se sekvencijalnim pretraživanjem ovog dela nađe najmanji element, pa on zameni mesto sa prvim elementom. Posle i - 1 koraka podniz a[1]..a[i - 1] predstavlja uređeni deo, a a[i]..a[n] neuređeni deo. Onda se u koraku i selektuje najmanji element neuređenog dela, pa on zameni mesto sa prvim elementom ovog dela i tako prelazi u uređeni deo. Postupak se završava kad se neuređeni deo svede samo na jedan element, čime i on postaje uređen. Postupak direktne selekcije je ilustrovan primerom sa slike 12.5, a algoritam je realizovan procedurom SELECTION-SORT. Algoritam se može ravnopravno implementirati tako da selektuje najveći element, pa onda uređeni deo raste od kraja niza ka početku.

Direktna selekcija pokazuje neke sličnosti, ali i razlike u poređenju sa direktnim umetanjem. Oba metoda održavaju uređeni i neuređeni deo, pri čemu se prvi povećava, a drugi smanjuje za po jedan element u svakom koraku. Međutim, dok direktno umetanje vrši poređenja u uređenom delu tražeći mesto umetanja za jedan element neuređenog dela, direktna selekcija poredi sve elemente u neuređenom delu. Prema tome, dok kod direktnog umetanja elementi mogu da dolaze jedan za drugim, direktna selekcija ne može da počne ako svi elementi nisu prisutni.

Sortiranje pomoću binarnog stabla

Poboljšani metodi selekcije u prvoj fazi vrše pretvaranje neuređenog niza u pogodnu strukturu da bi olakšali kasniju selekciju. Zbog inherentnih pogodnosti koje pruža najčešće je ta struktura binarno stablo. Metodi se razlikuju po karakteristikama binarnog stabla koje stvaraju kao pomoćnu strukturu.

Korišćenje stabla binarnog pretraživanja se nameće kao najprirodniji način zbog njegovog svojstva uređenosti. U prvoj fazi elementi neuređenog niza se uzimaju sekvencijalno i umeću u stablo binarnog pretraživanja. Prvi element postaje koren, a ostali dolaze na mesta saglasno svojoj vrednosti. Na slici 12.7 je prikazano stablo generisano od datog neuređenog niza. Jedini problem predstavljaju elementi sa jednakim vrednostima jer oni u izvornoj definiciji stabla binarnog pretraživanja nisu dozvoljeni. Kako sortiranje dozvoljava postojanje istih elemenata, onda se može usvojiti konvencija da se element sa manjom vrednošću stavlja u levo podstablo, a ako je veći ili jednak odlazi u desno podstablo. Drugi način da se reši ovaj slučaj je da se za svaki čvor održava lista zapisa sa ključevima iste vrednosti. Oba načina tretiranja istih ključeva omogućavaju stabilnost metoda.

6

Page 7: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic SlobodanKada se generiše stablo koje uključuje sve elemente zadatog niza, onda se njihov sortirani poredak može dobiti obilaskom stabla po inorder poretku. Ovaj obilazak praktično realizuje fazu selekcije.

Heapsort

Metod sortiranja preko stabla selekcije ima prednost što omogućuje dobar red vremenske složenosti i u prosečnom i u najgorem slučaju. Pored zahteva za dodatnim prostorom za stablo selekcije, nedostatak mu je i to što se ono u fazi selekcije sve više popunjava sa elementima –. Zbog toga se rade mnoga nepotrebna poređenja što umanjuje efikasnost. Prema tome, cilj je realizovati metod koji će zadržati prednosti, a otkloniti nedostatke osnovnog metoda preko stabla selekcije. Upravo te osobine su postignute kod algoritma heapsort (Williams, 1964) koji zato predstavlja jedan od najboljih poznatih algoritama za sortiranje.

Heapsort je, kao što mu i samo ime kaže, zasnovan na specifičnoj vrsti binarnog stabla koja se naziva heap. Heap se definiše kao kompletno ili skoro kompletno binarno stablo koje poseduje svojstvo uređenosti takvo da je sadržaj čvora oca uvek veći ili jednak od sadržaja oba sina. Treba primetiti da je ovo svojstvo uređenosti različito od stabla binarnog pretraživanja. Iz definicije sledi da koren stabla obavezno predstavlja najveći element u stablu. Upravo pomenuta činjenica opredeljuje pogodnost ovakve strukture za korišćenje u okviru algoritma za sortiranje zasnovanog na selekciji. Pored toga, svaka putanja koja vodi od korena do lista predstavlja nerastuću sekvencu elementa što se koristi u procedurama za održavanje heap-a.

Odmah se može zaključiti da ovakav algoritam treba da u prvoj fazi, na osnovu vrednosti elemenata neuređenog niza, generiše heap. Zatim, u fazi selekcije, u svakom koraku jednostavno izabere koren kao najveći element, ukloni ga iz heap-a i ubaci ga na početak uređenog dela niza. Naravno, pre sledećeg koraka treba reorganizovati smanjeno stablo da dobije novi koren, ali tako da opet zadovoljava svojstvo heap-a. Upravo ovo predstavlja i grub opis rada algoritma heapsort.

Heap se generiše na mestu ulaznog niza sukcesivnim ubacivanjem po jednog člana, počevši od elementa a[1] koji za sebe predstavlja inicijalni heap. Posle i - 1 koraka deo niza a[1]..a[i - 1] predstavlja heap. Zatim se, u i-tom koraku, stablu priključuje element a[i] kao novi element heap-a nhe na mestu lista u skoro kompletnom stablu. Na osnovu njegovog indeksa s izračunava se pozicija oca f celobrojnim deljenjem sa 2. Ako sin nije veći od oca, svojstvo heap-a je odmah zadovoljeno i ovaj korak je završen. Ako je sin veći od oca, onda oni zamenjuju mesto i postupak se dalje ponavlja na višim nivoima sve dok na putu ka korenu element nhe ne dođe do mesta u stablu gde je njegov otac veći ili jednak njemu ili se ne dođe do samog korena. Ovim je nhe zaustavljen u svojoj propagaciji naviše na odgovarajućem mestu čime je obezbeđeno da povećano stablo i dalje ima svojstvo heap-a. Kada se uključe svi elementi ulaznog niza, formiran je konačan heap od n elemenata i može da počne faza selekcije.

Pošto se najveći element nalazi u korenu, selekcija se svodi na njegovo uklanjanje sa heap-a i prebacivanje u sortirani deo. Pošto je cilj da se sortiran niz ostavi na mestu ulaznog niza, ovaj element treba prebaciti na krajnju poziciju istiskujući tako element heap-a last koji se tamo nalazi. Pošto je mesto korena

7

Page 8: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

ostalo upražnjeno, na njega treba staviti element last ako se time zadovoljava uređenost heap-a, što znači da element last nije manji od sinova korena. Ako ovaj uslov nije ispunjen, onda se element last zameni sa svojim većim sinom, koji staje

koren, a element last ide na nivo 1. Postupak se ponavlja i element last "pada" zamenjujući se sa većim sinom sve dok ne dođe na mesto gdje nije manji od oba sina ili ne dođe na mesto lista. Ovim postupkom se uređeni deo, koji se nalazi u gornjem delu niza, sukcesivno povećava na račun heap-a u donjem delu niza koji se smanjuje, dok na kraju heap ne nestane, a uređeni deo obuhvati čitav niz. Postupak procesiranja heap-a sa slike 12.9 i generisanje uređenog niza je demonstriran na slici 12.10.

Metodi zamene

Osnovna podela na tri grupe metoda unutrašnjeg sortiranja nije potpuno rezolutna. Kod metoda umetanja i selekcije takođe se primenjuje zamena elementa u nizu. Međutim, u ovoj grupi metoda zamena je glavni mehanizam na kojem se zasniva sortiranje. Zamena dva elementa se obavlja uvek kada se utvrdi da oni nisu u pravilnom poretku. U zavisnosti od toga da li se zamenjuju susedni elementi ili udaljeni elementi i na koji način, razlikuju se metode direktne zamene, particijskog sortiranja i pobitnog razdvajanja.

Direktna zamena

Metod direktne zamene (bubblesort) je jedan od najprostijih i zato najpopularnijih metoda sortiranja, ali, nažalost, i jedan od najneefikasnijih. Algoritam više puta sekvencijalno prolazi kroz niz i pritom upoređuje svaki element sa narednim u nizu, pa ako ova dva elementa nisu u pravilnom poretku, zamene im se mesta. U prvom koraku najveći element sigurno dođe na poslednje mesto i tako u svakom prolazu bar jedan element dođe na svoje mesto. Posle i-tog prolaza elementi a[n - i + 1]..a[n] su sigurno na svojim mestima. Kada n - 1 viših elemenata budu na svojim mestima, tada je i najmanji element na svom mestu, pa je zato potrebno najviše n - 1 prolaza za sortiranje čitavog niza.

Osnovna varijanta metoda direktne zamene može da se optimizuje u cilju skraćenja vremena sortiranja. Može da se primeti da u svakom koraku ne treba vršiti proveru svih elemenata, jer su posle i-tog koraka i najvećih elemenata na svojim mestima. Tako je svaki naredni korak sve kraći. Pored toga, ukoliko se zapamti najviša pozicija u nizu na kojoj je izvršena zamena, pošto su očigledno svi elementi iznad te pozicije u pravilnom poretku, u narednom koraku ne mora da se vrši provera tih elemenata. Prema tome, postupak može da se završi i u manje od n - 1 koraka. Štaviše, ako u nekom koraku nije izvršena nijedna zamena, to znači da ovaj korak nije doprineo sortiranju, jer su svi elementi na svojim mestima, pa naredni koraci nisu ni potrebni. Ove optimizacije algoritma su implementirane u proceduri BUBBLESORT.

Za smanjenje broja poređenja u shakersort-u može se iskoristiti i sledeće zapažanje. Ako je indeks j takav da se elementi na pozicijama j i j + 1 nisu zamenili u dva susedna koraka u suprotnim pravcima, onda ove pozicije treba isključiti iz kasnijih poređenja jer su na njih došli elementi koji treba da dođu. Na primer, neka

8

Page 9: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan se posmatra neuređeni niz 11, 9, 5, 3, 29, 17, 38, 20 i 15. Prolaz sleva

udesno daje 9, 5, 3, 11, 17, 29, 20, 15 i 38, a naredni prolaz s desna u levo daje 3, 5, 9, 11, 15, 17, 29, 20 i 38. Može se zapaziti da ni u prvom ni u drugom koraku

nije izvršena zamena između mesta 4 i 5, jer između njih ide granica dve grupe elemenata gde je svaki iz gornje grupe veći od svakoga iz donje grupe, pa se oni više ne mogu izmešati. Međutim, analize pokazuju da se broj poređenja neznatno smanjuje i da u svakom slučaju performansa ostaje istog reda složenosti.

Može se zaključiti da je broj premeštanja elemenata kod direktne zamene kritičan. Ovo je posledica činjenice da se zamenom susednih elemenata svaki element sporo kreće prema svome mestu, jer ga svaka zamena pomeri samo za jedno mesto. Zato je, kao i kod ostalih direktnih metoda, performansa ograničena na O(n2). Prirodno se javlja ideja slična onoj u shellsort-u da se pokuša zamena između udaljenih elemenata da bi elementi brže dolazili na svoje mesto. To je i suština Batcher-ovog paralelnog metoda (merge exchange) sortiranja. Ovaj metod ne propagira zamene već vrši poređenja i zamene na parovima udaljenih pozicija, pa, budući da se oni u istom koraku ne preklapaju, ovo se može vršiti čak i paralelno, ako računar to omogućuje. U svakom narednom koraku elementi iz uređenih parova iz prethodnog koraka se uparuju sa drugim parovima i tako vrši mešanje uređenih sekvenci sve dok se ne dođe do potpuno sortiranog niza. Pokazalo se da ove izmene znatno smanjuju broj koraka, pa on postaje reda O((log n)2) .

Particijsko sortiranje

Batcher-ov algoritam pokazuje da se poređenjima i zamenama na većem rastojanju može poboljšati efikasnost sortiranja. Međutim, ovom metodu nedostaje fleksibilnost, jer je sekvenca poređenja predeterminisana. Dalje poboljšanje bi moglo da se očekuje ukoliko se izbor narednih poređenja zasniva na rezultatu prethodnih i na taj način sekvenca poređenja prilagodi vrednostima elemenata niza. Takvo rezonovanje se koristi kod metoda particijskog sortiranja (partition exchange) koji je predložio Hoare (1962), pa ga je zbog dobrih performansi nazvao quicksort.

Particijsko sortiranje se zasniva na principu zamene na većoj udaljenosti uz dinamičko prilagođavanje sekvence poređenja. Ovaj metod pripada klasi algoritama koje do rešenja dolaze redukcijom problema na manje delove (divide-and-conquer) u više koraka. Algoritam počinje tako što na određen način izabere jedan element niza koji se naziva razdvojnim elementom ili pivotom. Zatim se niz reorganizuje tako da pivot dođe na poziciju j u nizu, a svi ostali elementi se razvrstaju u dve nesortirane particije koje ispunjavaju sledeće uslove:

donju particiju čine elementi koji su manji od vrednosti pivota ili jednaki sa njom, a[i]  pivot, 1 i j – 1,

gornju particiju čine elementi koji su veći od vrednosti pivota ili jednaki sa njom, a[i]  pivot, j + 1 i n.

S obzirom na kriterijum razdvajanja elemenata, može se zaključiti da je u ovom koraku pivot došao na svoju konačnu poziciju koju će imati u sortiranom nizu i više se neće pomerati, a svi elementi iz donje particije su manji ili jednaki od bilo kojeg elementa iz gornje particije. Time se problem svodi na sortiranje ove dve

9

Page 10: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

particije na isti način. Postupak se rekurzivno nastavlja sve dok svaka rezultujuća particija ne dođe do jedinične veličine, čime se dobija sortirani niz.

Osnovni deo u implementaciji algoritma predstavlja funkcija PARTITION koja deli particiju niza a ograničenu sa indeksima down (donja granica) i up

(gornja granica) na dva dela i vraća poziciju pivota u nizu između stvorene donje i gornje particije .

Pobitno razdvajanje

Razbijanje na particije se pokazalo kao efikasan način sortiranja u prethodnom metodu. Ovaj princip se koristi i u metodu pobitnog razdvajanja (radix exchange), ali se umesto korišćenja pivota uvodi drugačiji kriterijum podele na particije. Ovaj metod, za razliku od svih prethodnih, podrazumeva korišćenje binarne reprezentacije ključa (radix = 2) da bi se donosile binarne odluke u podeli na particije.

Neka binarna reprezentacija ključa ima m bitova (bm-1 bm-2 ....b0)2, gde je bm-1

najstariji, a b0 najmlađi bit. U prvom koraku se analizira najstariji bit bm-1 i stvaraju se dve particije: gornja u kojoj su svi ključevi sa bm-1 = 1 i donja u kojoj su svi ključevi sa bm-1 = 0. Zatim se u obe particije isti postupak ponavlja konsultujući bit bm-2. Postupak se nastavlja do particija jedinične veličine ili dok se ne ispitaju svi bitovi.

Postupak razdvajanja se vrši veoma slično kao u quicksort-u. Za particiju koja se obrađuje uvedu se dva tekuća indeksa: down koji se na početku postavi na donju granicu particije i up na gornju granicu particije. Zatim se down inkrementira sve dok se ne nađe ključ kod koga je tekući bit odlučivanja 1, a up se dekrementira sve dok se ne nađe ključ kod kojeg je taj isti bit 0, pa ova dva ključa zamene mesta. Ovo se radi sve dok ne postane down veće od up. Postupak pobitnog razdvajanja je ilustrovan na slici 12.14.

Postupak se može implementirati i rekurzivno i iterativno. Za iterativnu realizaciju se koristi stek. Radi smanjenja veličine steka, umesto procesiranja prvo manje particije kao kod quicksort-a, pogodno je prosto ići odozdo na gore, pošto tada potrebna veličina steka ne prelazi broj bitova ključa.

Za uniformno raspoređene ključeve vreme izvršavanja pobitnog razdvajanja je otprilike isto kao i za quicksort. Međutim, ovaj metod nije efikasan kad ima više istih ključeva, jer nepotrebno pokušava da razdvoji iste ključeve sve dok ne ispita svaki bit.

Opšta procena performansi metoda sortiranja poređenjem

Na osnovu pregleda izloženih metoda sortiranja koji su zasnovani isključivo na poređenju i zameni elemenata, može se zaključiti da među njima ne postoji metod koji daje bolju performansu od O(n log n) u srednjem i najboljem slučaju. Postavlja se prirodno pitanje da li je to teorijski maksimum za ovu grupu algoritama sortiranja.

10

Page 11: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic SlobodanU ovim metodima progres prema dobijanju pravilnog poretka se ostvaruje

poređenjem dva elementa na određenu relaciju. Pošto poređenje daje binaran rezultat (istinito ili neistinito), u zavisnosti od rezultata se nastavlja sa jednim od dva alternativna skupa aktivnosti. Kako suštinu algoritama čine poređenja između elemenata, zanemarujući premeštanja elemenata i kontrolu toka, na osnovu prethodnog se može zaključiti da se ponašanje ovih algoritama može pogodno modelirati stablom odlučivanja.

Svaki čvor grananja stabla opisuje neko poređenje a[i] a[j] (1 i, j n), a svaki list označava jednu moguću permutaciju ulaznog niza <p1, p2,..., pn>. Svaka permutacija predstavalja jedan mogući sortirani poredak koji odgovara skupu vrednosti neuređenog niza. Stablo odlučivanja specificira uslove da, počevši od korena, poređenja daju rezultate koji vode do tog lista, a[p1] a[p2] ... a[pn]. Ovih permutacija ima n! = n(n - 1)(n - 2)... , jer bilo koji od n elemenata može biti prvi, pa bilo koji od prostalih n - 1 elemenata može biti drugi, itd. Pravilan rad algoritma sortiranja obezbeđuje da se svaka od ovih permutacija mora pojaviti kao list stabla odlučivanja.

Metodi sortiranja linearne složenosti

Kao što je prethodno pokazano, prosečne performanse metoda sortiranja zasnovanih isključivo na poređenjima su ograničene na O(n log n), a samo u izuzetnim slučajevima pri povoljnom početnom poretku u ulaznom nizu može se postići bolja performansa, u najboljem slučaju reda O(n). Međutim, postoje i metodi koji koriste i druge operacije osim poređenja. Ove operacije, za razliku od poređenja zasnovanog na binarnom odlučivanju, mogu da daju više ishoda. Zbog toga pomenuti metodi, pod određenim pretpostavkama o vrednostima koje se sortiraju, mogu da postignu linearnu složenost. Ovde se razmatraju metodi: sortiranje brojanjem, adresno sortiranje i radix sortiranje.

Sortiranje brojanjem

Sortiranje brojanjem (counting sort) podrazumeva da su ključevi iz ulaznog niza celobrojne vrednosti u opsegu 1 a[i] k. Osnovna ideja ovog metoda je da za svaki element ulaznog niza odredi broj ostalih elementa iz niza koji su manji od njega. Na primer, ako je 10 elemenata niza manje od nekog elementa, onda on u sortiranom nizu treba da se smesti na poziciju 11. Naravno, osnovna ideja se mora nadgraditi imajući u vidu i mogućnost jednakih ključeva, jer oni ne mogu da se smeste na istu poziciju.

Procedura COUNTING-SORT (prikazana na sledećoj strani) koja realizuje ovaj metod, pored ulaznog neuređenog niza a, zahteva i dva dodatna niza C[1:k] za brojače vrednosti i B[1:n] za sortirani niz, jer se on ne može formirati na mestu ulaznog niza. Posle inicijalizacije brojača C na nulu, prođe se ulazni niz i za svaki element (na primer, vrednosti i) inkrementira se odgovarajući brojač C[i]. Zato, posle druge petlje, brojački niz C sadrži broj elemenata ulaznog niza koji imaju vrednosti 1..k . Na slici 12.16a je prikazan zadati ulazni neuređeni niz i stanje brojačkog vektora posle ove faze. Treća petlja sukcesivno od početka niza C uvećava vrednost tekućeg brojača prethodnim, tako da brojač C[i] tada označava broj elemenata koji su manji ili jednaki vrednosti i (slika 12.16b). Ovim je završena pripremna faza i može da počne konačno generisanje sortiranog niza.

11

Page 12: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

Adresno sortiranje

Adresno sortiranje (address calculation sort ili bucket sort), kao varijanta metoda umetanja, se zasniva na istom principu kao i heširanje. Ovaj postupak podrazumeva primenu određene funkcije f na sve elemente nesortiranog niza. Osnovno svojstvo funkcije f koje omogućava sortiranje je da je ona neopadajuća, što znači da, ako je x y, onda je f(x) f(y). Funkcija f razvrstava sve elemente u

m  n klasa ekvivalencije, a svaka klasa ekvivalencije se organizuje kao ulančana lista. Da bi se pristupilo ulančanim listama postoji jedan vektor njihovih zaglavlja. Funkcija f primenjena na element niza daje adresu ulaza ovog vektora koji sadrži zaglavlje odgovarajuće liste. Polazeći od zaglavlja element se umeće u listu tako da ona bude sortirana po neopadajućem poretku. Pošto se računa na veoma male klase

ekvivalencije, za ovo se koristi obično metod direktnog umetanja. Kada se svi elementi obrade, sve liste mogu da se spoje u zajedničku listu tako što se u polje pokazivača poslednjeg elementa prethodne liste prepiše polje zaglavlja liste na koju pokazuje sledeći viši zauzeti ulaz vektora zaglavlja. Na taj način se dobije jedna lista koja predstavlja sortirani niz elemenata.

Radix sortiranje

Dok se većina algoritama za sortiranje zasniva na operacijama sa vrednošću ključa kao celinom, radix sortiranje (ili distribution sort) koristi pozicionu reprezentaciju, pa odvojeno analizira cifre (ili znakove) na raznim pozicijama. Za demonstraciju ideje algoritma, bez gubitka opštosti, pretpostavlja se da su ključevi decimalni brojevi sa istim brojem od k cifara dk-1 dk-2 .. d0.

Prva ideja koja se prirodno nameće je razdvajanje brojeva u 10 grupa na osnovu vrednosti prve, najstarije cifre dk-1. Time se izvrši grubo sortiranje jer je svaki broj iz grupe koja odgovara manjoj prvoj cifri manji od brojeva iz grupa koje odgovaraju većoj prvoj cifri. Zatim se izvrši sortiranje u okviru svake grupe na po 10 podgrupa u zavisnosti od vrednosti druge cifre dk-2. Postupak se rekurzivno nastavlja i završava u k koraka, pri čemu je poslednji korak sortiranje po najmlađoj cifri d0, posle čega je ulazni niz sortiran. Iako je princip konceptualno jednostavan, pravolinijska implementacija bi bila dosta zametna zbog toga što ovim procesom nastaje sve veći broj sve manjih grupa o kojima treba voditi evidenciju, što se ne može uraditi na neki posebno efikasan način. Prema tome, treba zadržati jednostavnost osnovne ideje, a postupak modifikovati tako da i implementacija bude efikasna.

Ovo se može postići, ako se, protivno intuiciji, započne tako što se u prvom koraku vrši sortiranje po najmlađoj cifri. Uzimaju se redom elementi iz neuređenog niza i razvrstavaju u deset redova Q0 … Q9 po vrednosti najmlađe cifre, tako što se tekući element stavlja na kraj odgovarajućeg reda. Kad se tako obrade svi elementi, onda se svi redovi opet spoje u jedan niz po poretku Q0 Q1 ... Q9. U sledećem koraku se opet uzimaju elementi ovog niza redom i razvrstavaju u redove, ali po vrednosti druge cifre d1, pa se opet na kraju svi redovi spoje. Postupak se završava kad se izvrši uređenje i po najstarijoj cifri dk-1. Primer rada algoritma je prikazan za dvocifrene ključeve na slici 12.18. Stanje posle prvog koraka prikazano je na slici 12.18a, a konačno stanje na slici 12.18b.

12

Page 13: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic SlobodanSuština ovog algoritma je u stabilnosti procesa sortiranja, koja je omogućena

ubacivanjem elementa u red na njegov kraj. Prema tome, kada se u i-tom koraku vrši sortiranje po cifri di-1, veći je onaj element koji ima višu cifru na toj poziciji i on ide u odgovarajući red. Elementi sa istom cifrom idu u isti red, ali su oni zbog stabilnosti metoda već uređeni po nižim ciframa. Ovo omogućava spajanje redova bez vođenja računa o njihovim granicama.

Prilikom implementacije algoritma treba voditi računa o tome da se broj elemenata u redovima u pojedinim koracima ne može predvideti. Zato sekvencijalna realizacija redova nije pogodna, već treba pribeći ulančanoj reprezentaciji. Redovi se održavaju kao ulančane liste u koje se novi elementi stavljaju na kraj. Zbog toga, za svaki red treba još obezbediti pokazivače koji

pokazuju na početak i kraj liste. Na početku se od neuređenog niza napravi jedna lista iz koje se uzimaju elementi i stavljaju u redove. Posle svakog koraka sve

liste se opet nadovezuju u jednu listu, počevši od liste koja odgovara cifri 0 do liste koja odgovara cifri 9.

Primena principa sortiranja – statistika poretka

Neka je dat skup S od n elemenata različitih vrednosti. Veoma često se javlja problem određivanje k-tog najmanjeg elementa u skupu (elementa većeg od tačno k – 1 drugih elemenata u skupu), gde je 1 k n. Ovaj problem se obično nosi ime statistika poretka ili selekcija. Specijalni slučajevi nastaju kada je k = 1 (nalaženje minimuma) i k = n (nalaženje maksimuma). U slučaju da je k = (n + 1)/2 uvodi se pojam srednjeg elementa (median) koji se nalazi na centralnoj poziciji u sortiranom nizu, pa od njega ima jednak broj većih i manjih elemenata ako je n neparno. Ako je n parno, onda postoje dva ovakva elementa na pozicijama n/2 i n/2 + 1.

Očigledno da se izračunavanje statistike poretka može rešiti tako što se dati skup sortira kao niz, pa se, zatim, uzme elemenat sa pozicije k u sortiranom nizu. Međutim, pošto je ovo posebniji problem, on se može rešiti i efikasnije, sa linearnom složenošću, bez potpunog sortiranja niza.

13

Page 14: Seminarski-Metode Sortiranja-Unutrasnje i Spoljasne Sortiranje

Seminarski rad iz Algoritama i strukture podataka Miladinovic Slobodan

L I T E R A T U R A

1. http://en.wikipedia.org/wiki/Sorting_algorithm

2. Algoritmi i strukture podataka - Nenad Filipović

3. Strukture podataka i organizacija datoteka – Pavle Mogin

14