unutrasnje sortiranje - Marko Đorđević

Embed Size (px)

Citation preview

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    1/23

    VISOKA POSLOVNA KOLA STRUKOVNIH STUDIJA

    BLACE

    SEMINARSKIRAD

    Tema: Unutranje sortiranje grupe i sloenosti

    Predmet: Algoritmi i strukture podataka

    Student: Profesor:

    Marko orevi 29/08-III dr Branislav Jevtovi

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    2/23

    Sadraj

    1.Uvod.............................................................................................................................3

    2.Sortiranje poreenjem..................................................................................................4

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

    Direktno umetanje ........................................................................................................ 5

    Umetanje sa smanjenjem inkrementa ........................................................................... 7

    3.Metodi selekcije............................................................................................................8

    Direktna selekcija ......................................................................................................... 9

    Sortiranje pomou binarnog stabla ............................................................................. 10

    Heapsort ..................................................................................................................... 12

    4.Metodi zamene...........................................................................................................19

    Direktna zamena ........................................................................................................ 19

    Particijsko sortiranje ................................................................................................... 21

    2

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    3/23

    1. Uvod

    Unutranje sortiranje se primenjuje na skupove podataka ija veliina dozvoljava da se svi podaci istovremeno nalaze u operativnoj memoriji. Najee su podaci smeteni u vidu jednog

    vektora, pa se svakom podatku moe direktno pristupiti. Zato se unutranje sortiranje esto naziva isortiranjem nizova. Ponekad se niz podataka moe predstaviti i ulananom listom, ali tada podacimamora da se pristupa sekvencijalno, pa je ovakvo sortiranje generalno sporije. Zato se u daljemizlaganju, ako drugaije nije naglaeno, smatra da su podaci koji se sortiraju smeteni u nizu a[1], ...,a[n].

    Kako je jedan od zahteva pri sortiranju efikasno korienje prostora, sa ovog aspekta poeljnisu algoritmi koji vre sortiranje in situ (na mestu), koristei prostor gde je smeten neureeni niz uzjo samo konstantan broj dodatnih pomonih lokacija nezavisan od broja podataka. Jo vaniji jekriterijum vremenske sloenosti kao pokazatelja performansi ovih metoda. Uobiajeni indikatori

    performanse metoda unutranjeg sortiranja u zavisnosti od broja podataka n koji se sortiraju su:

    broj koraka algoritma da bi se dolo do reenja,

    broj poreenja kljueva (C),

    broj premetanja zapisa (M).

    Veina metoda u radu podrazumeva premetanje zapisa sa jednog mesta na drugo da bi se onikonano doveli u ureeni poredak. Meutim, kod veih zapisa ovo moe biti vremenski skupo i moese izbei po cenu malog dodatnog prostora. Jedan nain je sortiranje po adresi to podrazumeva

    korienje pomonog vektora koji sadri pokazivae na zapise (slika 1a). Sada je dovoljno premetatipokazivae u pomonom vektoru umesto samih zapisa, a krajnji poredak, prikazan na slici 1b, jeodreen upravo vektorom pokazivaa i na osnovu njega se zapisi mogu konano i fiziki premestiti.

    3

    2 3

    R 1

    4 8 1 5 3 7

    R 2 R 3 R 4

    k e y 2 3

    R 1

    4 8 1 5 3 7

    R 2 R 3 R 4

    k e y

    a ) b )

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    4/23

    Slika 1 Sortiranje po adresi stanje pokazivaa: a) pre sortiranja i

    b) posle sortiranja

    Drugi nain je ulanavanje zapisa izmeu sebe u listu bez njihovog premetanja. Tada svakizapis treba da ima i dodatno polje link koje ukazuje na zapis sa sledeom vrednou kljua, kao ispoljanji pokazivafirstkoji pokazuje na zapis sa najmanjim (ili najveim) kljuem (slika 2). Ovdese potreba za premetanjem izbegava prevezivanjem liste bez fizikog pomeranja zapisa.

    Slika 2 Sortiranje prevezivanjem pokazivaa

    Postoji vie pristupa problemu unutranjeg sortiranja, sa mnogo varijanti algoritama razliitesloenosti i ostalih karakteristika. Najoptiji nain za sortiranje je meusobno uporeivanje podataka po kljuu, pa se ova grupa metoda naziva sortiranje poreenjem. Pokazuje se da su najboljeperformanse kod ovih metoda u srednjem i najgorem sluaju ograniene na O(n log n). Postoji,takoe, i jedan manji broj metoda koji nisu zasnovani na meusobnom poreenju kljueva, ve sezasnivaju na nekim specifinim karakteristikama kljueva, a mogu da postignu i linearnu sloenost

    O(n). Posle izlaganja obe grupe metoda i razmatranja njihovih reprezentativnih tehnika, na kraju sedaje opte poreenje metoda unutranjeg sortiranja.

    2. Sortiranje poreenjem

    4

    2 3R 1

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

    k e y

    l i n k

    f i r s t

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    5/23

    Svi metodi ovoga tipa su zasnovani iskljuivo na meusobnom poreenju vrednosti kljuevaodgovarajuih zapisa koji se sortiraju. Glavni pristupi se mogu svrstati u etiri grupe: metodiumetanja, metodi selekcije, metodi zamene i metodi spajanja. Prve tri grupe se razmatraju u ovojglavi, a metodi spajanja, iako mogu da se koriste i za unutranje sortiranje, predstavljaju skoroiskljuivi nain sortiranja podataka na spoljanjim ureajima, pa se zato razmatraju u narednoj glavi.U izlaganju u okviru svake grupe se postupno poinje sa direktnim metodima. Ovi metodi dobroodslikavaju osnovne principe, jer su jednostavni, kratki i laki za razumevanje. Pomenute prednosti seplaaju slabijim performansama, pa tako za velike skupove podataka treba koristiti sloenije, aliefikasnije algoritme. Meutim, za male skupove podataka njihove prednosti ne dolaze do izraaja, pasu to sluajevi gde se direktni metodi primenjuju.

    Metodi umetanja

    Ova grupa metoda se zasniva na principu postepenog ureivanja niza, tako to se u svakomtrenutku odrava ureeni i neureeni deo. U svakom koraku se uzima jedan element iz neureenogdela i umee na odgovarajue mesto u ureenom delu, koji na taj nain raste. Predstavnici ove grupemetoda su: direktno umetanje i umetanje sa smanjenjem inkrementa.

    Direktno umetanje

    Osnovni princip se najbolje odslikava u metodu direktnog umetanja. U poetku se ureenideo sastoji samo od prvog elementa niza, a u neureeni deo spadaju svi ostali elementi. Neka se poslei - 1 koraka u ureenom delu nalaze elementi a1 ... ai-1. Tada se u koraku i uzima prvi element izneureenog dela ai i ubacuje na mesto koje mu po neopadajuem poretku odgovara u ureenom delu,ime se ovaj deo poveava za jedan element. Sortiranje se zavrava kad nema vie elemenata uneureenom delu. Direktno umetanje je ilustrovano po koracima za dati skup kljueva na slici 3.Algoritam za sortiranje direktnim umetanjem je realizovan procedurom INSERTION-SORT. Ulaz uproceduru predstavlja neureeni niz kljueva a[1:n], koji ona na kraju napravi ureenim.

    INSERTION-SORT(a)fori = 2 tondo

    K= a[i]j = i 1while (j > 0) and (a[j]) >K)

    do

    5

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    6/23

    a[j + 1] = a[j]j =j 1

    end_whilea[j + 1] =K

    end_for

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 92 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    6 5 7 56 5 7 9 92 70 9 6

    Slika 3 Direktno umetanje

    U svakoj iteraciji u okviru unutranje petlje uzima se tekui element kao prvi element izneureenog dela, pa se uporeuje redom sa elementima ureenog dela, prvo sa poslednjim, pa sapretposlednjim, itd., sve dok se ne naie na prvi element u ureenom delu koji nije vei od tekuegelementa. Pritom se elementi ureenog dela koji su vei od tekueg elementa pomeraju za po jednomesto navie i tako prave mesto za njegovo umetanje. Metod je stabilan jer kad klju koji se umeedoe do jednakog kljua u ureenom delu, on se stavlja neposredno iza njega.

    Implementacija gornjeg algoritma moe da se uini i efikasnijom tako to se pre sortiranjastavi graninik u a[0] ija vrednost odgovara minimalnom kljuu u nizu. Tada nema potrebe da se uunutranjoj petlji proverava da li je j vee od nule, jer tekui element onda ne moe da ide dalje odpozicije a[1].

    6

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    7/23

    Umetanje sa smanjenjem inkrementa

    Pokazuje se da veliki broj premetanja u metodu direktnog spajanja dolazi zbog injenice da sepremetaju samo susedni elementi, tako da element koji se umee mora da pomeri u proseku oko n/3

    ostalih. Bolji rezultati bi se mogli oekivati ako se umesto kratkih koraka omogue skokovi na veojdistanci. Znaajno poboljanje u ovom smeru u odnosu na direktno umetanje predloio je Shell umetodu koji se naziva umetanje sa smanjenjem inkrementa ili shellsort.

    Metod prvo razdvoji poetni niz na grupe tako to u svaku grupu svrstava elemente naekvidistantnim pozicijama u nizu. Ovaj razmak izmeu elemenata u grupi se naziva inkrementomh1.Broj grupa, naravno, odgovara vrednosti inkrementa. Zatim se ove grupe posebno sortiraju primenommetoda direktnog umetanja i niz postaje h1-sortiran. U narednom koraku u nizu koji je nastao posleprvog koraka inkrement se smanjuje na h2 < h1 i tako formira manji broj grupa sa veim brojemelemenata, pa se one opet nezavisno sortiraju. U svakom sledeem koraku isti postupak se ponavlja sa

    smanjenim inkrementom. Na kraju se postupak zavrava svoenjem inkrementa na 1 to znai da jeitav niz jedna grupa ijim se sortiranjem dobija konaan rezultat. Ovaj poslednji, jedinini korakgarantuje potpunu sortiranost niza. Na slici 4 demonstriran je rad ovog metoda. U prvom korakuinkrement je 4, pa postoje etiri grupe od po 2 elementa, da bi se u drugom koraku inkrement smanjiona 2, a u treem, poslednjem koraku na 1.

    Slika 4 Umetanje sa smanjenjem inkrementa

    7

    0 6 2 7 5 7 6 5 7 5

    6 5 7 5 6 5 7 9 9 2 7 0 9 6h1

    = 4

    6 5 2 7 0 5 7 9 9 7 5 6 9 6h2

    = 2

    0 2 7 6 5 7 6 5 7 5 9 9 9 6h3

    = 1

    9 6 9 9

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    8/23

    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 pretpostavljada se vrednosti inkremenata nalaze u nizu h[1:t].

    SHELL-SORT(a, h)fori = 1 totdo

    inc = h[i]forj = inc + 1 tondo

    y =a[j]k=j incwhile (k 1) and (y

    min)then

    min = a[j]

    pos =jend_if

    end_fora[pos] = a[i]a[i] = min

    end_for

    9

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    10/23

    Direktna selekcija pokazuje neke slinosti, ali i razlike u poreenju sa direktnim umetanjem.Oba metoda odravaju ureeni i neureeni deo, pri emu se prvi poveava, a drugi smanjuje za pojedan element u svakom koraku. Meutim, dok direktno umetanje vri poreenja u ureenom delutraei mesto umetanja za jedan element neureenog dela, direktna selekcija poredi sve elemente u

    neureenom delu. Prema tome, dok kod direktnog umetanja elementi mogu da dolaze jedan za drugim,direktna selekcija ne moe da pone ako svi elementi nisu prisutni.

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    0 7 5 6 5 7 9 9 2 7 6 5 9 6

    0 6 7 5 5 7 9 9 2 7 6 5 9 6

    0 6 2 7 5 7 9 9 7 5 6 5 9 6

    0 6 2 7 5 7 9 9 7 5 6 5 9 6

    0 6 2 7 5 7 6 5 7 5 9 9 9 6

    0 6 2 7 5 7 6 5 7 5 9 9 9 6

    Slika 5 Direktna selekcija

    Sortiranje pomou binarnog stabla

    Poboljani metodi selekcije u prvoj fazi vre pretvaranje neureenog niza u pogodnu strukturuda bi olakali kasniju selekciju. Zbog inherentnih pogodnosti koje prua najee je ta strukturabinarno stablo. Metodi se razlikuju po karakteristikama binarnog stabla koje stvaraju kao pomonustrukturu.

    Korienje stabla binarnog pretraivanja se namee kao najprirodniji nain zbog njegovogsvojstva ureenosti. U prvoj fazi elementi neureenog niza se uzimaju sekvencijalno i umeu u stablobinarnog pretraivanja. Prvi element postaje koren, a ostali dolaze na mesta saglasno svojoj vrednosti.Na slici 7 je prikazano stablo generisano od datog neureenog niza. Jedini problem predstavljaju

    10

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    11/23

    elementi sa jednakim vrednostima jer oni u izvornoj definiciji stabla binarnog pretraivanja nisudozvoljeni. Kako sortiranje dozvoljava postojanje istih elemenata, onda se moe usvojiti konvencijada se element sa manjom vrednou stavlja u levo podstablo, a ako je vei ili jednak odlazi u desnopodstablo. Drugi nain da se rei ovaj sluaj je da se za svaki vor odrava lista zapisa sa kljuevimaiste vrednosti. Oba naina tretiranja istih kljueva omoguavaju stabilnost metoda. Kada se generiestablo koje ukljuuje sve elemente zadatog niza, onda se njihov sortirani poredak moe dobitiobilaskom stabla po inorderporetku. Ovaj obilazak praktino realizuje fazu selekcije.

    11

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    6 5

    6

    5 7

    2 7

    7 5

    9 9

    9 6

    0

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    12/23

    Slika 7 Sortiranje pomou stabla binarnog pretraivanja

    Heapsort

    Metod sortiranja preko stabla selekcije ima prednost to omoguuje dobar red vremenskesloenosti i u prosenom i u najgorem sluaju. Pored zahteva za dodatnim prostorom za stablo

    selekcije, nedostatak mu je i to to se ono u fazi selekcije sve vie popunjava sa elementima . Zbogtoga se rade mnoga nepotrebna poreenja to umanjuje efikasnost. Prema tome, cilj je realizovatimetod koji e zadrati prednosti, a otkloniti nedostatke osnovnog metoda preko stabla selekcije.

    Upravo te osobine su postignute kod algoritma heapsort(Williams, 1964) koji zato predstavlja jedanod najboljih poznatih algoritama za sortiranje.

    12

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    13/23

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    7 5 5 7 9 9 9 6

    7 5 9 9

    9 9

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 5 6 5 7 2 7 0 9 6

    7 5 5 7 2 7 9 6

    7 5 9 6

    9 6

    9 9

    6 5 7 5 6 5 7 2 7 0

    7 5 5 7 2 7 0

    7 5 2 7

    7 5

    9 9

    9 6

    6 5 6 5 7 2 7 0

    6 5 5 7 2 7 0

    6 5 2 7

    7 5 9 9

    9 6

    6 5

    6 5 7 2 7 0

    5 7 2 7 0

    5 7 2 7

    7 5 9 9

    9 6

    5 7

    6 5

    6 2 7 0

    2 7 0

    2 7

    7 5 9 9

    9 6

    2 7

    6 5

    5 7

    6

    2 7

    0

    0

    0

    7 5 9 9

    9 6

    6

    6 5

    5 7

    6

    6

    6

    6

    2 7

    0

    0

    0

    7 5 9 9

    9 6

    0

    6 5

    5 7

    6

    a ) b )

    c ) d )

    e ) f )

    g ) h )

    Slika 8 Sortiranje pomou stabla selekcije: a) poetno stanje, b)-h) iteracijesortiranja

    Heapsortje, kao to mu i samo ime kae, zasnovan na specifinoj vrsti binarnog stabla koja senaziva heap. Heap se definie kao kompletno ili skoro kompletno binarno stablo koje posedujesvojstvo ureenosti takvo da je sadraj vora oca uvek vei ili jednak od sadraja oba sina. Trebaprimetiti da je ovo svojstvo ureenosti razliito od stabla binarnog pretraivanja. Iz definicije sledi dakoren stabla obavezno predstavlja najvei element u stablu. Upravo pomenuta injenica opredeljujepogodnost ovakve strukture za korienje u okviru algoritma za sortiranje zasnovanog na selekciji.

    13

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    14/23

    Pored toga, svaka putanja koja vodi od korena do lista predstavlja nerastuu sekvencu elementa to sekoristi u procedurama za odravanje heap-a.

    Odmah se moe zakljuiti da ovakav algoritam treba da u prvoj fazi, na osnovu vrednostielemenata neureenog niza, generie heap. Zatim, u fazi selekcije, u svakom koraku jednostavnoizabere koren kao najvei element, ukloni ga iz heap-a i ubaci ga na poetak ureenog dela niza.

    Naravno, pre sledeeg koraka treba reorganizovati smanjeno stablo da dobije novi koren, ali tako daopet zadovoljava svojstvo heap-a. Upravo ovo predstavlja i grub opis rada algoritma heapsort.

    Pored pogodnosti to omoguava jednostavnu selekciju najveeg elementa, velika prednostheap-a je, takoe, i mogunost pogodne implementacije koja olakava manipulacije sa ovomstrukturom. Poto skoro kompletno stablo ima sve popunjene nivoe osim poslednjeg, a poslednji nivoje sukcesivno popunjen od levog kraja donekle, ve ranije je naglaeno da se ono moe efikasnoimplementirati u vidu niza. Ovakva sekvencijalna reprezentacija otklanja potrebu za pokazivaima, jerje relacija otac-sin implicitno odreena njihovim indeksima u nizu. Ako stablo ima n vorova koji sunumerisani tako da koren ima broj 1, njegovi sinovi 2 i 3, zatim na sledeem nivou 4, 5, 6 i 7, itd, onda

    vori ima levog sina na mestu 2i, desnog sina na mestu 2i + 1 (naravno, ukoliko postoje), a oca namestu i/2 . Ove pozicije se mogu vrlo efikasno odrediti na osnovu indeksa tekueg elementa. Takose pozicija levog sina izraunava pomeranjem indeksa oca za jedno mesto ulevo, a pozicija desnogsina jo kad se posle pomeranja najnii bit postavi u 1. Pozicija oca se izraunava pomeranjem indeksasina za jedno mesto udesno. Tada, po definiciji heap-a smetenog u nizu a[1:n], vai

    a[i] a[2i] i a[i] a[2i + 1], 1 i < 2i < 2i + 1 n .

    Heap moe sasvim ravnopravno da se definie i organizuje tako da otac ima manju ili jednakuvrednost u poreenju sa sinovima, pa se u korenu pojavljuje najmanji element. Zbog svojih osobina,

    heap je izuzetno pogodna struktura za implementaciju prioritetnog reda, kako nerastueg tako ineopadajueg. Analiza performansi operacija pokazuje da je to jedna od najefikasnijih implementacijaprioritetnog reda.

    Sekvencijalna reprezentacija heap-a, kao to se u nastavku pokazuje, omoguuje sortiranje namestu. To znai da se heap moe kreirati i procesirati na mestu neureenog ulaznog niza i na istommestu, takoe, ostaviti ureeni niz, bez posebnog dodatnog prostora za samo stablo, ime se otklanjajedan od glavnih nedostataka metoda sortiranja pomou stabla selekcije.

    Slino ostalim naprednim metodima selekcije, heapsort se sastoji od dve faze: generisanjaheap-a i selekcije elemenata sa ponovnim procesiranjem heap-a. Kompaktna realizacija ovogalgoritma data je u vidu procedure HEAPSORT koja podrazumeva da se neureeni podaci nalaze unizu a[1:n].

    14

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    15/23

    HEAPSORT(a)fori = 2 tondo

    nhe = a[i]s = if=s/2while ((s > 1) and (a[f] < nhe)) do

    a[s] = a[f]s =ff=s/2

    end_whilea[s] = nhe

    end_forfori = ndownto 2 do

    last=a[i]a[i] = a[1]f= 1if ((i 1) 3 and (a[3] > a[2])) then

    s = 3else

    s = 2end_ifwhile (s i 1) and (a[s] > last) do

    a[f] = a[s]f=ss = 2fif((s + 1) i 1) and (a[s + 1] >

    a[s]) thens =s + 1

    end_ifend_while

    a[f] = lastend_for

    Heap se generie na mestu ulaznog niza sukcesivnim ubacivanjem po jednog lana, poevi odelementa 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 prikljuuje element a[i] kao novi element heap-anhe na mestu lista u skoro kompletnom stablu. Na osnovu njegovog indeksa s izraunava se pozicijaocafcelobrojnim deljenjem sa 2. Ako sin nije vei od oca, svojstvo heap-a je odmah zadovoljeno i

    ovaj korak je zavren. Ako je sin vei od oca, onda oni zamenjuju mesto i postupak se dalje ponavljana viim nivoima sve dok na putu ka korenu element nhe ne doe do mesta u stablu gde je njegov otacvei ili jednak njemu ili se ne doe do samog korena. Ovim je nhe zaustavljen u svojoj propagacijinavie na odgovarajuem mestu ime je obezbeeno da poveano stablo i dalje ima svojstvo heap-a.Kada se ukljue svi elementi ulaznog niza, formiran je konaan heap od n elemenata i moe da ponefaza selekcije. Postupak generisanja heap-a za odabrani skup kljueva je ilustrovan na slici 9.

    15

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    16/23

    6 5

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    7 5

    6 5

    6 5 6

    7 5

    5 7 6 5 2 7

    7 5 6

    9 9

    6 5 6

    7 5

    5 7

    6 5 6

    7 5

    5 7 9 9

    5 7 6 5 6 0

    7 5 2 7

    9 9

    5 7 6 5 6 0

    7 5 2 7

    9 9

    7 5 6 5 6 0

    9 6 2 7

    9 9

    9 6 5 7

    9 9 9 6 2 7 7 5 6 5 6 0 5 7

    Slika 9 Generisanje heap-a

    Poto se najvei element nalazi u korenu, selekcija se svodi na njegovo uklanjanje sa heap-a iprebacivanje u sortirani deo. Poto je cilj da se sortiran niz ostavi na mestu ulaznog niza, ovaj elementtreba prebaciti na krajnju poziciju istiskujui tako element heap-a lastkoji se tamo nalazi. Poto je

    mesto korena ostalo upranjeno, na njega treba staviti element lastako se time zadovoljava ureenostheap-a, to znai da element lastnije manji od sinova korena. Ako ovaj uslov nije ispunjen, onda seelement lastzameni sa svojim veim sinom, koji postaje koren, a element lastide na nivo 1. Postupakse ponavlja i element last"pada" zamenjujui se sa veim sinom sve dok ne doe na mesto gdje nijemanji od oba sina ili ne doe na mesto lista. Ovim postupkom se ureeni deo, koji se nalazi u gornjemdelu niza, sukcesivno poveava na raun heap-a u donjem delu niza koji se smanjuje, dok na krajuheap ne nestane, a ureeni deo obuhvati itav niz. Postupak procesiranja heap-a sa slike 9 igenerisanje ureenog niza je demonstriran na slici 10.

    16

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    17/23

    Slika 10 Selekcija i procesiranje heap-a

    Heapsortmoe da se realizuje i neto kompaktnije. Neka je ADJUST procedura koja stablo,iji je koren vori, a nijedan vor nema indeks vei od n, pretvara u heap, pretpostavljajui da levo idesno podstablo vora i ve zadovoljavaju osobine heap-a.

    17

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    18/23

    ADJUST(a, i, n)K= a[i]j = 2iwhile (j n) do

    if ((j < n) and (a[j] < a[j + 1]))then

    j=

    j+ 1end_if

    if (K a[j + 1]) thena[j/2] =Kreturn

    elsea[j/2] = a[j]j = 2j

    end_ifend_whilea[j/2] =K

    Ova procedura je osnova algoritma HEAPSORT-1 jer se poziva i pri generisanju i priprocesiranju.

    HEAPSORT-1(a)fori = n/2 downto 1 do

    ADJUST(a, i, n)end_forfori = n - 1 downto 1 do

    a[i + 1] a[1]ADJUST(a, 1, i)

    end_for

    Poto su vorovi (n/2 + 1)..n listovi stabla, oni su heap-ovi sa po jednim elementom, pa se prigenerisanju heap-a poziva procedura ADJUST za vorove n/2..1 upravo u tom poretku. Pri

    procesiranju heap-a u svakom koraku prvi i poslednji vor na heap-u zamene mesta, poslednji elementizlazi izvan heap-a, a zatim se heap preuredi pozivom procedure ADJUST.

    18

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    19/23

    4. Metodi zamene

    Osnovna podela na tri grupe metoda unutranjeg sortiranja nije potpuno rezolutna. Kodmetoda umetanja i selekcije takoe se primenjuje zamena elementa u nizu. Meutim, u ovoj grupimetoda zamena je glavni mehanizam na kojem se zasniva sortiranje. Zamena dva elementa se obavljauvek kada se utvrdi da oni nisu u pravilnom poretku. U zavisnosti od toga da li se zamenjuju susednielementi ili udaljeni elementi i na koji nain, razlikuju se metode direktne zamene, particijskogsortiranja i pobitnog razdvajanja.

    Direktna zamena

    Metod direktne zamene (bubblesort) je jedan od najprostijih i zato najpopularnijih metodasortiranja, ali, naalost, i jedan od najneefikasnijih. Algoritam vie puta sekvencijalno prolazi kroz nizi pritom uporeuje svaki element sa narednim u nizu, pa ako ova dva elementa nisu u pravilnomporetku, zamene im se mesta. U prvom koraku najvei element sigurno doe na poslednje mesto i takou svakom prolazu bar jedan element doe na svoje mesto. Posle i-tog prolaza elementi a[n - i +1]..a[n] su sigurno na svojim mestima. Kada n - 1 viih elemenata budu na svojim mestima, tada je inajmanji element na svom mestu, pa je zato potrebno najvie n - 1 prolaza za sortiranje itavog niza.

    Osnovna varijanta metoda direktne zamene moe da se optimizuje u cilju skraenja vremenasortiranja. Moe da se primeti da u svakom koraku ne treba vriti proveru svih elemenata, jer su poslei-tog koraka i najveih elemenata na svojim mestima. Tako je svaki naredni korak sve krai. Poredtoga, ukoliko se zapamti najvia pozicija u nizu na kojoj je izvrena zamena, poto su oigledno svielementi iznad te pozicije u pravilnom poretku, u narednom koraku ne mora da se vri provera tihelemenata. Prema tome, postupak moe da se zavri i u manje od n - 1 koraka. tavie, ako u nekomkoraku nije izvrena nijedna zamena, to znai da ovaj korak nije doprineo sortiranju, jer su svielementi na svojim mestima, pa naredni koraci nisu ni potrebni. Ove optimizacije algoritma suimplementirane u proceduri BUBBLESORT.

    19

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    20/23

    BUBBLESORT(a)pos = nrepeat

    bound=pospos = 0fori = 1 tobound- 1

    doif (a[i] > a[i +

    1]) thena[i]

    a[i + 1]pos =

    i

    end_ifend_for

    untilpos = 0

    Promenljiva pos pamti u svakom koraku najviu poziciju sa koje je neki element zameniomesto sa svojim desnim susedom, pa u narednom koraku ne treba ii preko te pozicije jer je gornji deoniza ve ureen. Kako se na poetku svakog koraka ova promenljiva postavlja na 0, ako takva ostane ina kraju koraka, onda zamena nije ni bilo i algoritam zavrava rad. Na slici 11 prikazana je primenasortiranja direktnom zamenom na skupu kljueva iz prethodnih primera.

    Slika 11 Direktna zamena

    20

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    6 5 7 56 5 7 9 92 7 0 9 6

    6 5 7 56 5 7 9 92 7 0 9 6

    6 5 7 56 5 7 9 92 7 0 9 6

    6 5 7 56 5 7 9 92 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    p o s= 7

    p o s= 5

    p o s= 4

    p o s= 3

    p o s= 2

    p o s= 1

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    21/23

    Particijsko sortiranje

    Batcher-ov algoritam pokazuje da se poreenjima i zamenama na veem rastojanju moepoboljati efikasnost sortiranja. Meutim, ovom metodu nedostaje fleksibilnost, jer je sekvencaporeenja predeterminisana. Dalje poboljanje bi moglo da se oekuje ukoliko se izbor narednihporeenja zasniva na rezultatu prethodnih i na taj nain sekvenca poreenja prilagodi vrednostimaelemenata niza. Takvo rezonovanje se koristi kod metodaparticijskog sortiranja (partitionexchange)koji je predloio Hoare (1962), pa ga je zbog dobrih performansi nazvao quicksort.

    Particijsko sortiranje se zasniva na principu zamene na veoj udaljenosti uz dinamikoprilagoavanje sekvence poreenja. Ovaj metod pripada klasi algoritama koje do reenja dolazeredukcijom problema na manje delove (divide-and-conquer) u vie koraka. Algoritam poinje tako tona odreen nain izabere jedan element niza koji se naziva razdvojnim elementom ili pivotom. Zatimse niz reorganizuje tako da pivot doe na poziciju j u nizu, a svi ostali elementi se razvrstaju u dvenesortirane particije koje ispunjavaju sledee 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 vei od vrednosti pivota ili jednaki sa njom, a[i] pivot,

    j + 1 i n.

    S obzirom na kriterijum razdvajanja elemenata, moe se zakljuiti da je u ovom koraku pivot

    doao na svoju konanu poziciju koju e imati u sortiranom nizu i vie se nee pomerati, a svielementi iz donje particije su manji ili jednaki od bilo kojeg elementa iz gornje particije. Time seproblem svodi na sortiranje ove dve particije na isti nain. Postupak se rekurzivno nastavlja sve doksvaka rezultujua particija ne doe do jedinine veliine, ime se dobija sortirani niz.

    Algoritam particijskog sortiranja je realizovan u vidu rekurzivne procedure QUICKSORT gdese pretpostavlja da je neureeni niz a[1:n]. Ova procedura se inicijalno poziva sa argumentima low =1i high = n, jer je na poetku itav neureeni niz jedna particija.

    QUICKSORT(a, low, high)j = PARTITION(a, low, high)QUICKSORT(a, low,j - 1)QUICKSORT(a, j + 1, high)

    21

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    22/23

    Osnovni deo u implementaciji algoritma predstavlja funkcija PARTITION koja deli particijuniza a ogranienu sa indeksima down (donja granica) i up (gornja granica) na dva dela i vraa pozicijupivota u nizu izmeu stvorene donje i gornje particije .

    PARTITION(a, down, up)i = down

    j = uppivot= a[down]while (i pivot) do

    j =j 1end_whileif(i

  • 8/2/2019 unutrasnje sortiranje - Marko orevi

    23/23

    .

    Slika 13 Particijsko sortiranje

    i

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    6 5 7 56 5 7 9 92 70 9 6

    6 5 0 6 5 7 9 9 2 7 7 5 9 6

    j

    6 5 7 5 6 5 7 9 9 2 7 0 9 6

    i j

    6 5 0 6 5 7 2 7 9 9 7 5 9 6

    ij

    6 52 7 60 5 7 9 9 7 5 9 6

    6 56 0 5 7 9 6 7 5 9 92 7