Sortiranje
1
Algoritmi i strukture podataka (450&550)
Sortiranje
Algoritmi i strukture podataka 2
Sadržaj
Uvod
Osnovne metode sortiranja
Exchange sort – sortiranje zamjenom
Selection sort – sortiranje odabirom
Insertion sort – sortiranje umetanjem
Bubble sort
Shellsort
Quicksort
Spajanje nizova i Mergesort
Redovi s prioritetom i Heapsort
Sortiranje
2
Algoritmi i strukture podataka 3
Uvod
Sortiranje je postupak pri kojem se postojeći elementi ponovno raspoređuju po definiranom pravilu (najčešće po numeričkom ili abecednom redu)
Ključ je dio elementa po kojem se provodi sortiranje (redni broj, prezime, godina rođenja).
Ukoliko se elementi koji se sortiraju nalaze u memoriji tada se radi o internom sortiranju (internal sorting).
Sortiranje podataka koji se nalaze na diskovima ili vrpcama (količina podataka je pre velika da bi stali u memoriju) se naziva eksterno sortiranje(external sorting).
Kako bi se ocijenila efikasnost algoritma za sortiranje promatra se:
vrijeme izvršavanja algoritma
dodatna količina memorije koju koristi algoritam
Algoritmi i strukture podataka 4
Uvod
Algoritam za sortiranje je postojan (stable) ukoliko zadržava uredan raspored podataka koji imaju iste vrijednosti ključa po kojem se sortira.
Ajduković 1Bekavac 4Bonačić 5 Erceg 3Galić 1Kardum 5Miloš 4Popović 2Tomić 2Vlašić 1Vodopija 5Zrno 4
Početno stanje
Ajduković 1Vlašić 1Galić 1Tomić 2Popović 2Erceg 3Miloš 4Zrno 4Bekavac 4Bonačić 5 Vodopija 5Kardum 5
Nepostojan algoritam
Ajduković 1Galić 1Vlašić 1Popović 2Tomić 2Erceg 3Bekavac 4Miloš 4Zrno 4Bonačić 5 Kardum 5Vodopija 5
Postojan algoritam
U slučaju velikih elemenata preporuča se indirektno sortiranje:
ne premještaju se čitavi elementi nego pokazivači na te elemente.
Sortiranje
3
Algoritmi i strukture podataka 5
“Exchange sort”
Princip rada:
Kreće od prvog elementa u nizu i uspoređuje ga sa svim ostalima.
Ukoliko se naiđe na manji element mijenja se njegova vrijednost s manjim.
Postupak se ponavlja sve dok se ne sortira čitav niz.
4. 1 2 4 6 7
3. 1 2 4 7 6
2 6 4 7 1
2. 1 2 6 7 4
4 6 2 7 1
1. 4 6 2 7 1
2 6 4 7 1
1 6 4 7 2
Red izvršenja:
usporedbi: T(N) = N*(N-1)/2 => O(N) = N2
zamjene: W(N) = N*(N-1)/2 => O(N) = N2
Algoritmi i strukture podataka 6
“Bubble sort”
Metoda koja uspoređuje dva susjedna elementa i mijenja im mjesta ukoliko je uvjet zamjene zadovoljen.
Princip rada:
Krene se od kraja niza i uspoređuju se dva susjedna elementa. Ukoliko je desni manji mijenjaju im se mjesta.
Usporedba se ponavlja sve dok najmanji element ne dođe na prvu poziciju.
Nakon toga usporedba ponovo kreće od zadnjeg elementa kako bi se pravi element doveo na drugu poziciju, …
Sortiranje
4
Algoritmi i strukture podataka 7
“Bubble sort”
Red izvršenja:
usporedbi: T(N) = N*(N-1)/2 => O(N) = N2
zamjene: T(N) = N*(N-1)/2 => O(N) = N2
3. 1 2 4 6 7
2. 1 2 4 6 7
4 6 2 1 7
1 4 6 2 7
4 6 2 7 1
1. 4 6 2 7 1
4 6 1 2 7
4 1 6 2 7
4. 1 2 4 6 7
Algoritmi i strukture podataka 8
“Selection sort”
Princip rada:
Pronalazi najmanji element u nizu i zamjenjuje ga s elementom na prvoj mjestu.
Pronalazi drugi najmanji element i zamjenjuje ga s elementom na drugom mjestu.
Ponavlja postupak sve dok se ne sortira čitav niz.
4. 1 2 4 6 7
3. 1 2 4 7 6
1 6 2 7 4
2. 1 2 6 7 4
4 6 2 7 1
1. 4 6 2 7 1
Sortiranje
5
Algoritmi i strukture podataka 9
“Selection sort”
Red izvršenja:
usporedbi: T(N) = N*(N-1)/2 => O(N) = N2
zamjene: T(N) = N => O(N) = N
Nedostatak:
Vrijeme izvođenja algoritma ne ovisi o tome je li dio elemenata niza prethodno sortirani ili ne,
Pronalaženje minimalnog člana u jednom prolasku ne daje informaciju gdje bi se mogao nalaziti sljedeći minimalni element.
Prednost:
Kod sortiranja elemenata koji sadrže velike količine podataka a male ključeve – cijena viška usporedbi je puno manja, nego cijena premještanja velikih količina podataka.
Algoritmi i strukture podataka 10
“Insertion sort”
Metoda sortiranja koja sortira niz na način da sve elemente veće od promatranog pomiče za jedno mjesto desno i na taj način stvara mjesto za promatrani element.
Princip rada za i-ti (i = 1, …, N-1) element:
Uspoređuje se njegova vrijednost s vrijednošću i-1 elementa i ukoliko je X[i] < X[i-1], i-1 element se pomiče za jedno mjesto u desno,
Sljedeći se uspoređuje i-2 element i postupak se ponavlja sve dok se ne nađe element koji je < X[i]i X[i] se ubacuje iza njega.
Sortiranje
6
Algoritmi i strukture podataka 11
“Insertion sort”
Red izvršenja:
usporedbi: T(N) = N*(N-1)/2 => O(N) = N2
zamjene: W(N) = N2/2 i A(N) = N2/4
Za razliku od selection sorta red izvršavanja ovog algoritma ovisi o prethodnom rasporedu elemenata jer ako je uvjet sortiranja za neki element zadovoljen odmah se ide na sljedeći bez daljnje usporedbe.
4. 1 2 4 6 7
3. 2 4 6 7 1
2. 4 6 2 7 1
2 4 6 7 1
4 6 2 7 1
1. 4 6 2 7 1
4 6 6 7 1
4 4 6 7 1
Algoritmi i strukture podataka 12
Osnovne metode sortiranja
Sve 4 metode karakterizira:
kvadratni red izvršavanja algoritma
ne zahtijevaju dodatnu memoriju
Primjer sortiranja 500 slučajnih brojeva [0, 1000], različitim metodama
Sortiranje
7
Algoritmi i strukture podataka 13
Osnovne metode sortiranja
Sortirani elementi [0, 100>
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
exchange sort selection sort
insertion sort bubble sort
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
Algoritmi i strukture podataka 14
Osnovne metode sortiranja
Sortirani elementi [0, 200>
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
exchange sort selection sort
insertion sort bubble sort
Sortiranje
8
Algoritmi i strukture podataka 15
Osnovne metode sortiranja
Sortirani elementi [0, 300>
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
exchange sort selection sort
insertion sort bubble sort
Algoritmi i strukture podataka 16
Osnovne metode sortiranja
Sortirani elementi [0, 400>
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
exchange sort selection sort
insertion sort bubble sort
Sortiranje
9
Algoritmi i strukture podataka 17
Osnovne metode sortiranja
Sortirani elementi [0, 500>
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
Index
Vri
jed
no
st
Algoritmi i strukture podataka 18
Shellsort Nazvan je po autoru (Donald Shell) i jedan je od prvih algoritama za sortiranje čiji je
red manji od O(N2).
Osnovna ideja:
uspoređuje se (i mijenja) svaki h-ti element
h se postepeno smanjuje (do 1) što rezultira sortiranim nizom.
Original 81 94 11 96 12 35 17 95 28 58 41 75 15
h = 5 81 94 11 96 12 35 17 95 28 58 41 75 15
35 94 11 96 12 41 17 95 28 58 81 75 15
35 17 11 96 12 41 75 95 28 58 81 94 15
35 17 11 96 12 41 75 15 28 58 81 94 95
35 17 11 28 12 41 75 15 96 58 81 94 95
35 17 11 28 12 41 75 15 96 58 81 94 95
h = 3 35 17 11 28 12 41 75 15 96 58 81 94 95
28 12 11 35 15 41 58 17 94 75 81 96 95
h = 1 11 12 15 17 28 35 41 58 75 81 94 95 96
Sortiranje
10
Algoritmi i strukture podataka 19
Shellsort
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
Indeks
Vri
jed
no
st
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
h = 250
h = 7, 3, 1
h = 62
h = 125
h = 15h = 31
Primjer sortiranja niza od 500 elemenata a h se računa:
h1= N/2, h2= h1/2, … , hi= hi-1/2, … 1
Algoritmi i strukture podataka 20
Shellsort - algoritam
Sortiranje
11
Algoritmi i strukture podataka 21
Shellsort
Niz vrijednosti h (ht, ht-1,…, h1) koje se koriste kod Shellsorta se naziva niz inkrementa.
Mogući su različiti nizovi inkrementa, ali h1 mora biti 1.
Kako odabrati niz inkrementa?
Različiti nizovi su testirani i opisani u literaturi,
neki su se pokazali uspješni u praksi,
najbolji nije još pronađen!!!
Algoritmi i strukture podataka 22
Shellsort
Vrijeme izvršavanja algoritma visi o odabiru niza inkrementa.
Shellov niz - {1, … , (N/2)/2, N/2} = > O(N2) – najgori slučaj odabira niza inkrementa.
Hibbardov niz - {1, 3, 7, …, 2k-1} = > O(N3/2) – u najgorem slučaju,
O(N5/4) – u prosjeku, ali je to utvrđeno simulacijom a nitko nije uspio dokazati.
Sedgwickov niz - {1, 5, 19, 41, 109, …}, u kojem se vrijednosti generiraju po dvije formule: 9*4i-9*2i+1 i 4i-3*2i+1 (za i = 0: 9*40-9*20+1 = 1 , 40-3*20+1 = -1;za i = 1: 9*41-9*21+1 = 19, 41-3*21+1 = -1;za i = 2: 9*42-9*22+1 = 109, 42-3*22+1 = 5; …) = > O(N4/3) – u najgorem slučaju,
O(N7/6) – u prosjeku.
Sortiranje
12
Algoritmi i strukture podataka 23
Shellsort
Za primjer od 500 slučajnih brojeva:
Shellov niz = {250, 125, 62, 31, 15, 7, 3, 1}
Hibbardov niz = {255, 127, 63, 31, 15, 7, 3, 1}
Sedgwickov niz = {209, 109, 41, 19, 5, 1}
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
0
200
400
600
800
1000
1200
0 100 200 300 400 500 600
Shell i Hibbardov niz Sedgwickov niz
Algoritmi i strukture podataka 24
Quicksort
Kao što samo ime kaže ovaj je algoritam najbrži poznati algoritam za sortiranje.
Radi se o “podjeli pa vladaj” rekurzivnom algoritmu.
Za male nizove (N ≤ 20) performanse quicksorta i nisu baš dobre, zbog toga je preporuka koristiti “insertion sort” koji rezultira i sa 15% boljim performansama.
Prosječno vrijeme izvršavanja ovog algoritma je O(N*logN), najgore vrijeme izvršavanja je O(N2) – ali se lako može postići da vjerojatnost da on nastupi eksponencijalno pada.
Osnovna ideja:
Ako je broj elemenata u nizu X 0 ili 1 vrati se iz funkcije,
Odaberi bilo koji element niza kao stožer / klin (pivot) - v,
Podjeli niz X na X1 i X2 : X1 = {x S | {v} / x ≤ v}, X2 = {x S | {v} / x ≥ v },
Vrati {quickSort(X1), v, quickSort(X2)}
Sortiranje
13
Algoritmi i strukture podataka 25
Quicksort
odabir stožera
podjela
quicksortquicksort
Problem:
pravila ne definiraju jasno što se radi s elementima koji su jednaki stožeru (v).
odabir stožera,
odabir podjele elemenata.
Algoritmi i strukture podataka 26
Quicksort – odabir stožera
Krivi način:
Odabir prvog elementa u nizu kao stožera, što je u redu ako su elementi slučajno raspoređeni.
Ako su elementi djelomično sortirani na početku tada jedan podskup sadrži skoro sve elemente i rekurzivnim pozivima se situacija još pogoršava.
Siguran način:
Odabrati stožer slučajno.
Najčešće daje dobre rezultate, ali problem je “neslučajno” generiranje brojeva i brzina generiranja slučajnog broja.
Srednji od troje dijeljenje (Median-of-Three):
Najbolji stožer bi bio element koji je srednja vrijednost svih elementa polja:
Slučajno se odaberu tri elementa i računa se njihova srednja vrijednost
Uzmu se krajnji lijevi (indeks = L), krajnji desni (D) i središnji element (indeks (L+D)/2) i njihova srednja vrijednost se uzme kao stožer.
Sortiranje
14
Algoritmi i strukture podataka 27
Quicksort – odabir podjele Odabir stožera [L = 0, D = 9, S=(0+9)/2 = 4 ]
Usporede se i sortiraju L, S i D elementi i onaj sa srednjom vrijednošću postaje stožer i ide na zadnje mjesto.
8 1 4 9 6 3 5 2 7 0
L S D
Postavi se i da pokazuje na prvi, a j na predzadnji element.
Dok je i lijevo od j uspoređuju se elementi sa stožerom:
i se pomiče u desno ako je el. manji od stožera, staje ako nije;
j se pomiče u lijevo ako je el. veći od stožera, staje ako nije;
ako su se i i j zaustavili, i pokazuje na “veliki” a j na “mali” element, ti elementi mijenjaju mjesta.
0 1 4 9 8 3 5 2 7 6
i i j
0 1 4 9 8 3 5 2 7 6
i j0 1 4 2 8 3 5 9 7 6
i j
0 1 4 2 8 3 5 9 7 6
i j0 1 4 2 5 3 8 9 7 6
i j
0 1 4 2 5 3 8 9 7 6
j i Kada je i prešao desno a j lijevo, stožer
element se mijenja s elementom i.
Algoritmi i strukture podataka 28
Quicksort – odabir podjele Svi elementi s indeksom < od stožera su
manji od njega, a svi elementi čiji je indeks > stožera su veći od njega.
0 1 4 2 5 3 6 9 7 8
v
Što ako postoje vrijednosti jednake stožeru?
Trebaju li se i i j zaustaviti ako naiđu na vrijednosti jednake stožeru?
i i j se trebaju ponašati na isti način jer će inače svi elementi jednaki stožeru završiti u jednom podnizu.
Postoje dvije mogućnosti koje se razmatraju na primjeru niza s identičnim elementima:
Ukoliko se i i j zaustavljaju, biti će mnogo zamjena među istim elementima, ali u konačnici će se i i j sresti u sredini -> osnovni niz se dijeli na dva približno jednaka podniza => O(N*logN)
Ukoliko se i i j ne zaustavljaju, i će doći do kraja niza bez ijedne zamjene, ali tada stožer ostaje na zadnjem mjestu i sortiranje se opet poziva za gotovo jednako velik niz, tj. pod nizovi su vrlo različiti => O(N2)
Sortiranje
15
Algoritmi i strukture podataka 29
Quicksort – algoritam
Algoritmi i strukture podataka 30
Spajanje (merging) i Mergsort
Rekurzivni algoritam za koji je W(N*log(N)).
Osnovna ideja je spajanje dva sortirana niza (A, B).
Kako bi se smanjio broj prolazaka kroz nizove A i B (na samo jedan prolazak) njihovi elementi se u sortiranom redoslijedu kopiraju u novi niz (C).
1 13 24 26 2 15 27 38
pA pB pC
1 13 24 26 2 15 27 38 1
pA pB pC
1 13 24 26 2 15 27 38 1 2
pA pB pC
Sortiranje
16
Algoritmi i strukture podataka 31
Spajanje (merging) i Mergsort
Ukoliko se dođe do kraja jednog od nizova svi preostali elementi iz drugog niza se kopiraju.
1 13 24 26 2 15 27 38 1 2 13 15 24 26
pA pB pC
1 13 24 26 2 15 27 38 1 2 13 15 24 26 27 38
pA pB pC
Vrijeme potrebno za spajanje dva sortirana niza je linearno jer se za slučaj N elemenata radi N-1 usporedba.
Algoritmi i strukture podataka 32
Spajanje (merging) i Mergsort
Algoritam:
Za N = 1, niz je sortiran
Za N ≠ 1, niz se dijeli na dva dijela i sortiranje se rekurzivno primjenjuje na podnizove, …, sve dok se ne dođe do niza veličine 1.
Sortirani podnizovi se zatim spajaju.
24 13 26 1 2 27 38 15
24 13 26 1
24 13
24 13
13 24 1 26
1 13 24 26 2 15 27 38
1 2 13 15 24 26 27 38
Algoritam koristi “podjeli pa vladaj” strategiju.
Sortiranje
17
Algoritmi i strukture podataka 33
“Two-Way” merging algoritam
Algoritmi i strukture podataka 34
“Two-Way” merging algoritam
Sortiranje
18
Algoritmi i strukture podataka 35
Spajanje (merging) i Mergsort
Iako je red ovog algoritma O(N*logN) (kao i kod quicksorta) rijetko se koristi za sortiranja zbog sljedećih problema:
spajanje dva sortirana niza zahtijeva korištenje dodatne memorije koja je proporcionalna veličini ta dva niza,
vrijeme koje se troši na prebacivanje elemenata iz privremenog niza u originalni (to je moguće izbjeći ako se mijenja uloga privremenog i originalnog niza) .
Prednosti:
Ovaj algoritam je postojan, za razliku od quicksorta i heapsorta.
Pristupa uzastopnim elementima, pa je zgodan za sortiranje vezanih listi, gdje se može pristupati samo uzastopnim elementima.
Mergsort algoritam se koristi kao osnova algoritama za eksterno sortiranje.
Algoritmi i strukture podataka 36
Usporedba algoritama za sortiranje
Sortiranje
19
Algoritmi i strukture podataka 37
Redovi s prioritetom
Red s prioritetom je struktura koja funkcionira po FIFO principu, s razlikom da se svakom elementu dodjeljuje određeni prioritet, te elementi s većim prioritetom dolaze na početak reda.
1(p=1)
2(p=1)
3(p=1)
4(p=0)
stavi
1(p=1)
2(p=1)
3(p=1)
4(p=0)
Implementacija redova s prioritetom:
Vezane liste – novi element se dodaje na u listu ovisno o prioritetu (stvara se sortirani red), što u najgorem slučaju je O(N), a element se skida s početka liste (O(1)).
Binarno stablo pretraživanja –dodavanje i skidanje elementa je O(logN).
Binarne gomile – heap.
Algoritmi i strukture podataka 38
Redovi s prioritetom i heap Binarne gomile – heap – binarno stablo koje se puni od lijeva prema desno i sve razine
moraju u potpunosti popunjene (osim zadnje) - potpuna binarna stabla.
Kod definiranja heapa, bitno je odrediti ključ po kojem se formira stablo (heap orderproperty).
Primjer heapa koji se formira prema najmanjem ključu:
U heapu za svaki čvor X vrijedi da je ključ roditelja je manji (ili jednak) ključu tog čvora, s iznimkom root čvora koji nema roditelja.
root čvor sadrži element s najmanjim ključem.
Sortiranje
20
Algoritmi i strukture podataka 39
Heap – dodavanje elementa
Kod dodavanja elementa X na heap:
X se dodaje na iduće slobodno mjesto ako to ne narušava svojstvo heapa,
U prazni element se premješta njegov roditelj i tako se prazni element diže na višu razinu sve dok se ne nađe mjesto za X uz uvjet da je zadovoljeno pravilo heapa.
13
1621
3124
26
19 68
3265
13
1621
3124
26
19 68
3265
13
1621
24
26
19 68
3265 31
13
16
2124
26
19 68
3265 31
dodaj14
13
1614
2124
26
19 68
3265 31
Algoritmi i strukture podataka 40
Heap – brisanje elementa
Brisanje elementa u ovom slučaju znači brisanje minimalnog (root) el, tj:
stvara se prazni elementa na vrhu stabla,
briše se zadnji dodani el. a njegova vrijednost se smješta na heap:
u prazni el. ako je to moguće ili se manji od dvoje djece pomiče na prazno mjesto i stvara novo prazno mjesto,
postupak se ponavlja dok se zadnji element ne smjesti.
brisi
Sortiranje
21
Algoritmi i strukture podataka 41
Realizacija heapa pomoću niza
Heap kao potpuno binarno stablo, zbog pravilne strukture, je moguće prikazati pomoću niza i na taj način izbjeći pokazivače.
A B C D E F G H I J
0 1 2 3 4 5 6 7 8 9 10 11 12 13
Pri tome za element i u nizu vrijedi:
lijevo dijete se nalazi na poziciji 2*i,
desno dijete se nalazi na poziciji 2*i + 1,
roditelj se nalazi na poziciji i/2.
Za pronaći djecu ili roditelje nisu potrebni pokazivači nego osnovne mat. operacije.
Algoritmi i strukture podataka 42
Heapsort
Sortiranje nekog niza pomoću heapsorta podrazumijeva stavljanje elementa zadanog niza na heap (definiran po ključu po kojem želimo sortirati niz), te ponovno vraćanje elemenata u sortiranom redoslijedu.
Za niz: 97, 53, 59, 26, 41, 58, 31
Dodavanje elemenata na heap: Skidanje elemenata s heapa:
26, 31, 41, 53, 58, 59, 97
Iako je vrijeme potrebno za sortiranje niza O(N*logN) u praksi je sporiji od Shellsorta sa Shellovim nizom.
Najveći je problem što ovaj algoritam zahtijeva dodatnu memoriju, proporcionalnu veličini originalnog niza.