sortiranje podataka

49
Sortiranje podataka Sortiranje podataka

Upload: hoshi

Post on 14-Jan-2016

58 views

Category:

Documents


0 download

DESCRIPTION

Sortiranje podataka. Sortiranje izborom. Sortiranje izborom (selection sort) je vrlo jednostavan algoritam sortiranja - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Sortiranje podataka

Sortiranje podatakaSortiranje podataka

Page 2: Sortiranje podataka

22

Sortiranje izboromSortiranje izborom

Sortiranje izborom (selection sort) je vrlo jednostavan algoritam Sortiranje izborom (selection sort) je vrlo jednostavan algoritam sortiranjasortiranja

Algoritam: u listi se nađe najmanji element i on mijenja mjesto s Algoritam: u listi se nađe najmanji element i on mijenja mjesto s prvim elementom liste, postupak se ponavlja za listu od druge do prvim elementom liste, postupak se ponavlja za listu od druge do zadnje pozicije itd, u svakom koraku je lista koja se sortira kraća za zadnje pozicije itd, u svakom koraku je lista koja se sortira kraća za jedan elementjedan element

Primjer: 7 3 5 1 8 4 2 9 6Primjer: 7 3 5 1 8 4 2 9 6

1 | 3 5 7 8 4 2 9 61 | 3 5 7 8 4 2 9 6

1 | 2 | 5 7 8 4 3 9 61 | 2 | 5 7 8 4 3 9 6

1 | 2 | 3 | 7 8 4 5 9 61 | 2 | 3 | 7 8 4 5 9 6

1 | 2 | 3 | 4 | 8 7 5 9 61 | 2 | 3 | 4 | 8 7 5 9 6

1 | 2 | 3 | 4 | 5 | 7 8 9 61 | 2 | 3 | 4 | 5 | 7 8 9 6

1 | 2 | 3 | 4 | 5 | 6 | 8 9 71 | 2 | 3 | 4 | 5 | 6 | 8 9 7

1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 81 | 2 | 3 | 4 | 5 | 6 | 7 | 9 8

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 91 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9

Page 3: Sortiranje podataka

33

Zapis algoritma: ulaz je nesortirana lista aZapis algoritma: ulaz je nesortirana lista a11, …, a, …, ann , izlaz je sortirana , izlaz je sortirana listalista

1. za i = 1, 2, …, n-1 radi korake 2 – 51. za i = 1, 2, …, n-1 radi korake 2 – 5

2. min = i2. min = i

3. za j = 2, .., n radi korak 43. za j = 2, .., n radi korak 4

4. ako je a4. ako je ajj < a < aii min = j min = j

5. zamjeni(a5. zamjeni(aii, a, aminmin)) Koraci 1, 2 i 5 se ponavljaju n-1 puta, koraci 3 i 4 se u prvom prolazu Koraci 1, 2 i 5 se ponavljaju n-1 puta, koraci 3 i 4 se u prvom prolazu

obavljaju n-1 puta, u drugom n-2, …, bez obzira na ulazni niz obavljaju n-1 puta, u drugom n-2, …, bez obzira na ulazni niz podataka. Jedini korak čiji broj ponavljanja se mijenja ovisno o podataka. Jedini korak čiji broj ponavljanja se mijenja ovisno o ulaznom nizu podataka je korak 4. Najgori slučaj (koji se ne može ulaznom nizu podataka je korak 4. Najgori slučaj (koji se ne može dogoditi) je da se korak 4 obavlja u svakom prolazu.dogoditi) je da se korak 4 obavlja u svakom prolazu.

Složenost problema je dakle:Složenost problema je dakle:

Dakle složenost u najgorem slučaju je Dakle složenost u najgorem slučaju je ΘΘ(n(n22))

222121

1n

1i21max n *

2

c)n

2

c(c

2

1)n(n*cn*ci*cn*c(n)T

Page 4: Sortiranje podataka

44

U najboljem slučaju, korak 4 se ne obavi nijednom (lista je već U najboljem slučaju, korak 4 se ne obavi nijednom (lista je već sortirana)sortirana)

Tada je konstanta uz sumu manja nego u najgorem slučaju, ali je Tada je konstanta uz sumu manja nego u najgorem slučaju, ali je ukupan broj operacija ista funkcija od n, pa je dakle i u najboljem ukupan broj operacija ista funkcija od n, pa je dakle i u najboljem slučaju složenost algoritma slučaju složenost algoritma ΘΘ(n(n22))

Iz toga slijedi da je i prosječna složenost algoritma Iz toga slijedi da je i prosječna složenost algoritma ΘΘ(n(n22))

Page 5: Sortiranje podataka

55

Sortiranje zamjenomSortiranje zamjenom (exchange sort) algoritam: prvi element niza se uspoređuje sa svakim (exchange sort) algoritam: prvi element niza se uspoređuje sa svakim

iza sebe, kada se naiđe na manji element, oni zamjene mjesta i iza sebe, kada se naiđe na manji element, oni zamjene mjesta i nastave se uspoređivati preostali elementi s novim prvim elementom. nastave se uspoređivati preostali elementi s novim prvim elementom. Nakon prvog prolaza na prvom mjestu je najmanji element. Postupak Nakon prvog prolaza na prvom mjestu je najmanji element. Postupak se ponavlja za drugi, itdse ponavlja za drugi, itd

Primjer: 7 3 5 1 8 4 2 9 6 Primjer: 7 3 5 1 8 4 2 9 6

3 7 5 1 8 4 2 9 63 7 5 1 8 4 2 9 6

1 7 5 3 8 4 2 9 6 do kraja niza se ne nađe manji1 7 5 3 8 4 2 9 6 do kraja niza se ne nađe manji

1 | 7 5 3 8 4 2 9 61 | 7 5 3 8 4 2 9 6

1 | 5 7 3 8 4 2 9 61 | 5 7 3 8 4 2 9 6

1 | 3 7 5 8 4 2 9 61 | 3 7 5 8 4 2 9 6

1 | 2 | 7 5 8 4 3 9 61 | 2 | 7 5 8 4 3 9 6

1 | 2 | 5 7 8 4 3 9 61 | 2 | 5 7 8 4 3 9 6

1 | 2 | 4 7 8 5 3 9 61 | 2 | 4 7 8 5 3 9 6

1 | 2 | 3 | 7 8 5 4 9 61 | 2 | 3 | 7 8 5 4 9 6

1 | 2 | 3 | 5 8 7 4 9 61 | 2 | 3 | 5 8 7 4 9 6

1 | 2 | 3 | 4 | 8 7 5 9 61 | 2 | 3 | 4 | 8 7 5 9 6

Page 6: Sortiranje podataka

66

1 | 2 | 3 | 4 | 7 8 5 9 61 | 2 | 3 | 4 | 7 8 5 9 6

1 | 2 | 3 | 4 | 5 | 8 7 9 61 | 2 | 3 | 4 | 5 | 8 7 9 6

1 | 2 | 3 | 4 | 5 | 7 8 9 61 | 2 | 3 | 4 | 5 | 7 8 9 6

1 | 2 | 3 | 4 | 5 | 6 | 8 9 71 | 2 | 3 | 4 | 5 | 6 | 8 9 7

1 | 2 | 3 | 4 | 5 | 6 | 7 | 9 81 | 2 | 3 | 4 | 5 | 6 | 7 | 9 8

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 91 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Zapis algoritma: ulaz je nesortirana lista aZapis algoritma: ulaz je nesortirana lista a11, …, a, …, ann , izlaz je sortirana , izlaz je sortirana

listalista

1. za i = 1, .., n-1 radi korake 2 i 31. za i = 1, .., n-1 radi korake 2 i 3

2. za j = i+1, …, n radi korak 32. za j = i+1, …, n radi korak 3

3. ako je a3. ako je aii > a > ajj onda zamjeni (a onda zamjeni (aii, a, ajj)) Složenost algoritma: vanjska petlja se izvrši n-1 puta, unutranja u Složenost algoritma: vanjska petlja se izvrši n-1 puta, unutranja u

prvom prolazu n-1 puta, u drugom n-2, …prvom prolazu n-1 puta, u drugom n-2, … Najgori slučaj: uvijek se izvrši zamjena u koraku 3Najgori slučaj: uvijek se izvrši zamjena u koraku 3

Dakle složenost je Dakle složenost je ΘΘ(n(n22))

2

1)n(n*c1)-(n*ci*c1)-(n*c(n)T 21

1n

1i21max

Page 7: Sortiranje podataka

77

U najboljem slučaju niti jednom nema zamjene mjesta u koraku 3, što U najboljem slučaju niti jednom nema zamjene mjesta u koraku 3, što znači da je konstanta uz sumu manja nego u najgorem slučaju, ali je znači da je konstanta uz sumu manja nego u najgorem slučaju, ali je ovisnost o n istog oblika, što znači da je i najbolja složenost ovisnost o n istog oblika, što znači da je i najbolja složenost ΘΘ(n(n22))

To naravno znači da je i prosječna složenost To naravno znači da je i prosječna složenost ΘΘ(n(n22))

Page 8: Sortiranje podataka

88

Sortiranje umetanjemSortiranje umetanjem

Sortiranje umetanjem (insertion sort) se vrlo često koristi ako broj Sortiranje umetanjem (insertion sort) se vrlo često koristi ako broj elemenata u nizu nije prevelikelemenata u nizu nije prevelik

Algoritam: početna lista se dijeli na dva dijela, prvi već sortiran i drugi Algoritam: početna lista se dijeli na dva dijela, prvi već sortiran i drugi koji treba sortirati. Na početku je u prvom dijelu samo prvi element. U koji treba sortirati. Na početku je u prvom dijelu samo prvi element. U svakom koraku se uzima prvi element iz drugog dijela liste i umeće se u svakom koraku se uzima prvi element iz drugog dijela liste i umeće se u odgovarajuće mjesto u prvom dijelu liste. Elementi sortiranog dijela liste odgovarajuće mjesto u prvom dijelu liste. Elementi sortiranog dijela liste uspoređuju se od zadnjeg prema prvomuspoređuju se od zadnjeg prema prvom

Primjer: 7 | 3 5 1 8 4 2 9 6 uzme se 3Primjer: 7 | 3 5 1 8 4 2 9 6 uzme se 3

3 7 | 5 1 8 4 2 9 6 uzme se 5, usporedi s 7, 33 7 | 5 1 8 4 2 9 6 uzme se 5, usporedi s 7, 3

3 5 7 | 1 8 4 2 9 6 uzme se 1, usporedi s 7, 5, 33 5 7 | 1 8 4 2 9 6 uzme se 1, usporedi s 7, 5, 3

1 3 5 7 | 8 4 2 9 6 uzme se 8, usporedi s 7, ne pomiče se1 3 5 7 | 8 4 2 9 6 uzme se 8, usporedi s 7, ne pomiče se

1 3 5 7 8 | 4 2 9 6 sad ide 4, usporedi s 8, 7, 5, 31 3 5 7 8 | 4 2 9 6 sad ide 4, usporedi s 8, 7, 5, 3

1 3 4 5 7 8 | 2 9 6 sad ide 2, usporedi se s 8, 7, 5, 4, 3, 11 3 4 5 7 8 | 2 9 6 sad ide 2, usporedi se s 8, 7, 5, 4, 3, 1

1 2 3 4 5 7 8 | 9 6 9 se usporedi s 8 i ne pomiče1 2 3 4 5 7 8 | 9 6 9 se usporedi s 8 i ne pomiče

1 2 3 4 5 7 8 9 | 6 6 se usporedi s 9, 8, 7, 51 2 3 4 5 7 8 9 | 6 6 se usporedi s 9, 8, 7, 5

1 2 3 4 5 6 7 8 91 2 3 4 5 6 7 8 9

Page 9: Sortiranje podataka

99

Zapis algoritma: ulaz je nesortirana lista aZapis algoritma: ulaz je nesortirana lista a11, …, a, …, ann , izlaz je sortirana , izlaz je sortirana listalista

1. izvrši korake 2-4 za j=2, …, n1. izvrši korake 2-4 za j=2, …, n

2. p=a2. p=ajj

3. izvrši korak 4 za i=1, …, j-13. izvrši korak 4 za i=1, …, j-1

4. ako je a4. ako je aii > a > ajj zamjeni(a zamjeni(aii, a, ajj)) Složenost algoritma: koraci 1 i 2 se uvijek izvrše n-1 puta, koraci 3 i 4 Složenost algoritma: koraci 1 i 2 se uvijek izvrše n-1 puta, koraci 3 i 4

se u prvom prolazu izvrše jednom, pa dvaput, …, sve do n-1 putase u prvom prolazu izvrše jednom, pa dvaput, …, sve do n-1 puta Najgori slučaj je obrnuto sortirana lista kada se u svakom koraku Najgori slučaj je obrnuto sortirana lista kada se u svakom koraku

moraju zamijeniti elementi:moraju zamijeniti elementi:

Dakle složenost je Dakle složenost je ΘΘ(n(n22)) Najbolji slučaj je kad nema zamjena elemenata, pa je konstanta uz Najbolji slučaj je kad nema zamjena elemenata, pa je konstanta uz

sumu manja, ali je opet složenost sumu manja, ali je opet složenost ΘΘ(n(n22)) Pa i ovdje vrijedi da je prosječna složenost Pa i ovdje vrijedi da je prosječna složenost ΘΘ(n(n22))

2

1)n(n*c1)-(n*ci*c1)-(n*c(n)T 21

1n

1i21max

Page 10: Sortiranje podataka

1010

Mjehuričasto sortiranjeMjehuričasto sortiranje

(bubble sort) – prolazi se redom po elementima liste i svaki se (bubble sort) – prolazi se redom po elementima liste i svaki se uspoređuje sa svojim sljedbenikom, ako je veći zamjene mjesta, time je uspoređuje sa svojim sljedbenikom, ako je veći zamjene mjesta, time je na kraju prvog prolaza listom na zadnjem mjestu najveći element, na kraju prvog prolaza listom na zadnjem mjestu najveći element, postupak se ponavlja za listu skraćenu za zadnju pozicijupostupak se ponavlja za listu skraćenu za zadnju poziciju

Primjer: 7 3 5 1 8 4 2 9 6 1. i 2. element mijenjaju mjestaPrimjer: 7 3 5 1 8 4 2 9 6 1. i 2. element mijenjaju mjesta

3 7 5 1 8 4 2 9 6 2. i 3. element mijenjaju mjesta3 7 5 1 8 4 2 9 6 2. i 3. element mijenjaju mjesta

3 5 7 1 8 4 2 9 6 3. <-> 4.3 5 7 1 8 4 2 9 6 3. <-> 4.

3 5 1 7 8 4 2 9 6 sad mjesta mijenjaju 5. i 6.3 5 1 7 8 4 2 9 6 sad mjesta mijenjaju 5. i 6.

3 5 1 7 4 8 2 9 6 6. <-> 7.3 5 1 7 4 8 2 9 6 6. <-> 7.

3 5 1 7 4 2 8 9 6 8. <-> 9.3 5 1 7 4 2 8 9 6 8. <-> 9.

3 5 1 7 4 2 8 6 | 9 2. prolaz: kreće se od početka, kraća 3 5 1 7 4 2 8 6 | 9 2. prolaz: kreće se od početka, kraća listalista

3 1 5 7 4 2 8 6 | 9 4. <-> 5.3 1 5 7 4 2 8 6 | 9 4. <-> 5.

3 1 5 4 7 2 8 6 | 9 5. <-> 6.3 1 5 4 7 2 8 6 | 9 5. <-> 6.

3 1 5 4 2 7 8 6 | 9 7. <-> 8.3 1 5 4 2 7 8 6 | 9 7. <-> 8.

3 1 5 4 2 7 6 | 8 9 3. prolaz: iznova na kraćoj listi 3 1 5 4 2 7 6 | 8 9 3. prolaz: iznova na kraćoj listi

Page 11: Sortiranje podataka

1111

1 3 5 4 2 7 6 | 8 9 3. <-> 4.1 3 5 4 2 7 6 | 8 9 3. <-> 4.

1 3 4 5 2 7 6 | 8 9 4. <-> 5.1 3 4 5 2 7 6 | 8 9 4. <-> 5.

1 3 4 2 5 7 6 | 8 9 6. <-> 7.1 3 4 2 5 7 6 | 8 9 6. <-> 7.

1 3 4 2 5 6 | 7 8 9 novi prolaz1 3 4 2 5 6 | 7 8 9 novi prolaz

1 3 2 4 5 | 6 7 8 9 novi prolaz1 3 2 4 5 | 6 7 8 9 novi prolaz

1 2 3 4 | 5 6 7 8 9 još 3. puta prolazi listu, iako je 1 2 3 4 | 5 6 7 8 9 još 3. puta prolazi listu, iako je sortiranasortirana

Zapis algoritma: ulaz je nesortirana lista aZapis algoritma: ulaz je nesortirana lista a11, …, a, …, ann , izlaz je sortirana , izlaz je sortirana listalista

1. ponavljaj korake 2-3 za i=1, …,n-11. ponavljaj korake 2-3 za i=1, …,n-1

2. ponavljaj korak 3. za j=1, …, n-12. ponavljaj korak 3. za j=1, …, n-1

3. ako je a3. ako je ajj > a > aj+1j+1 onda zamjeni(a onda zamjeni(ajj, a, aj+1j+1)) Složenost algoritma: korak 1. se uvijek ponavlja n-1 puta, u prvom Složenost algoritma: korak 1. se uvijek ponavlja n-1 puta, u prvom

prolazi se koraci 2. i 3. ponavljaju n-1 puta, pa n-2, itd.prolazi se koraci 2. i 3. ponavljaju n-1 puta, pa n-2, itd. Najgori slučaj: u svakom koraku se vrši zamjena, najbolji slučaj je kad Najgori slučaj: u svakom koraku se vrši zamjena, najbolji slučaj je kad

nema nijedne zamjene; u oba slučaja isti je broj provjera i ovisnost o n, nema nijedne zamjene; u oba slučaja isti je broj provjera i ovisnost o n, tj. i asimptotska ovisnost je ista:tj. i asimptotska ovisnost je ista:

)(2

1)n(n*c1)-(n*ci*c1)-(n*c(n)T 2

21

1n

1i21pros n

Page 12: Sortiranje podataka

1212

U primjeru je algoritam izvršio svih osam koraka iako je sortiranje U primjeru je algoritam izvršio svih osam koraka iako je sortiranje bilo gotovo nakon pet koraka, tj, već u šestom koraku nije bilo bilo gotovo nakon pet koraka, tj, već u šestom koraku nije bilo nijedne zamjene mjestanijedne zamjene mjesta

Poboljšanje algoritma: provjerava se da li je bilo zamjene u tekućem Poboljšanje algoritma: provjerava se da li je bilo zamjene u tekućem koraku, ako nije, lista je već sortirana i algoritam završavakoraku, ako nije, lista je već sortirana i algoritam završava

Page 13: Sortiranje podataka

1313

Sortiranje spajanjemSortiranje spajanjem

Sortiranje spajanjem (merge sort) je algoritam sortiranja čija je Sortiranje spajanjem (merge sort) je algoritam sortiranja čija je složenost manja od kvadratne – O(n*lg n)složenost manja od kvadratne – O(n*lg n)

Strategija podijeli-pa-vladajStrategija podijeli-pa-vladaj Primjer: (9, 2, 4, 6, 8, 1, 7, 5)Primjer: (9, 2, 4, 6, 8, 1, 7, 5) podijeli se na dvije listepodijeli se na dvije liste (9, 2, 4, 6) (8, 1, 7, 5)(9, 2, 4, 6) (8, 1, 7, 5) podijeli se na 2 liste podijeli se na 2 listepodijeli se na 2 liste podijeli se na 2 liste (9, 2) (4, 6) (8, 1) (7, 5)(9, 2) (4, 6) (8, 1) (7, 5) podijeli na po 2 listepodijeli na po 2 liste (9) (2) (4) (6) (8) (1) (7) (5)(9) (2) (4) (6) (8) (1) (7) (5) spajanjespajanje (2, 9) (4, 6) (1, 8) (5, 7)(2, 9) (4, 6) (1, 8) (5, 7) spajanje spajanjespajanje spajanje (2, 4, 6, 9) (1, 5, 7, 8) (2, 4, 6, 9) (1, 5, 7, 8) spajanjespajanje (1, 2, 4, 5, 6, 7, 8, 9)(1, 2, 4, 5, 6, 7, 8, 9)

Page 14: Sortiranje podataka

1414

Algoritam sortiranja spajanjem:Algoritam sortiranja spajanjem:

ulaz je lista aulaz je lista a11, …, a, …, ann , izlaz sortirana lista , izlaz sortirana lista

1. podijeli listu na dva jednaka dijela1. podijeli listu na dva jednaka dijela

2. sortiraj listu a2. sortiraj listu a11, …, a, …, an/2n/2

3. sortiraj listu a3. sortiraj listu an/2+1n/2+1, …, a, …, ann

4. spoji liste a4. spoji liste a11, …, a, …, an/2n/2 i a i an/2+1n/2+1, …, a, …, ann Algoritam spajanja dvije sortirane liste u jednu sortiranu listu:Algoritam spajanja dvije sortirane liste u jednu sortiranu listu:

ulaz su dvije sortirane liste bulaz su dvije sortirane liste b11, …, b, …, bk k i ci c11, …, c, …, cll , izlaz je sortirana lista , izlaz je sortirana lista aa11, …, a, …, ak+lk+l

1. i = 1, j = 11. i = 1, j = 1

2. ponavljaj korak 3 sve dok je i 2. ponavljaj korak 3 sve dok je i ≤≤ k i j k i j ≤≤ l l

3. ako je b3. ako je bii < c < cjj onda a onda ai+j-1i+j-1 = b = bii, i=i+1, inače a, i=i+1, inače ai+j-1i+j-1 = c = cjj, j=j+1, j=j+1

4. ponavljaj korak 5 sve dok je i 4. ponavljaj korak 5 sve dok je i ≤≤ k k

5. a5. ai+j-1i+j-1 = b = bii, i=i+1, i=i+1

6. ponavljaj korak 7 sve dok je j 6. ponavljaj korak 7 sve dok je j ≤≤ l l

7. a7. ai+j-1i+j-1 = c = cjj, j=j+1, j=j+1

Page 15: Sortiranje podataka

1515

Složenost algoritma spajanja: korak 1. se obavlja jednom, za svaki Složenost algoritma spajanja: korak 1. se obavlja jednom, za svaki element u listama izvršit će se jedan od blokova naredbi iz koraka 3 ili element u listama izvršit će se jedan od blokova naredbi iz koraka 3 ili koraka 5 ili koraka 7, koji svi imaju istu konstantnu složenost koja se koraka 5 ili koraka 7, koji svi imaju istu konstantnu složenost koja se može odozgo ograničitimože odozgo ograničiti

Najgori i najbolji slučaj zahtijevaju isti broj operacija, pa su njihove Najgori i najbolji slučaj zahtijevaju isti broj operacija, pa su njihove složenosti iste, kao i prosječna složenost:složenosti iste, kao i prosječna složenost:

TTpros pros ≤ c1 + (k + l)*c≤ c1 + (k + l)*c22 + (k + l)*c + (k + l)*c33 = c1 + (k + l)(c = c1 + (k + l)(c22 + c + c33))

TTprospros = O(k + l) = O(k + l) Složenost algoritma sortiranja spajanjem: za sve instance problema, Složenost algoritma sortiranja spajanjem: za sve instance problema,

složenost je ista (najbolji slučaj = najgori slučaj = prosječni slučaj)složenost je ista (najbolji slučaj = najgori slučaj = prosječni slučaj)

TTprospros(n) = 2 * (n) = 2 * TTprospros(n/2) + (n/2) + TTprospros(spajanje n/2 + n/2)=(spajanje n/2 + n/2)=

= 2 * = 2 * TTprospros(n/2) + d(n/2) + d11 * n + d * n + d22

Rekurzija: tRekurzija: tnn = 2 * t = 2 * tn/2n/2 + d + d11 * n + d * n + d22

Uvodi se supstitucija:Uvodi se supstitucija:

ntsn 2

211

21221

2

22

2**2

**2**2 1

dds

dndtdndtts

nn

n nnn

Page 16: Sortiranje podataka

1616

Oduzme se jdba za n-1 član od jdbe za n-ti član:Oduzme se jdba za n-1 član od jdbe za n-ti član:

ssnn = 3 * s = 3 * sn-1n-1 – 2 * s – 2 * sn-2n-2 + 2 + 2n-1 n-1 * d* d11

Oduzme se izraz za n-1 član pomnožen s dva od izraza za n-ti član:Oduzme se izraz za n-1 član pomnožen s dva od izraza za n-ti član:

ssnn = 5 * s = 5 * sn-1n-1 - 8 * s - 8 * sn-2n-2 + 4 * s + 4 * sn-3n-3

Dobivena je homogena rekurzivna jdba, čija karakteristična jdbaDobivena je homogena rekurzivna jdba, čija karakteristična jdba

xx33 – 5 * x – 5 * x22 + 8 * x - 4 = 0 + 8 * x - 4 = 0

ima dvostruki korijen xima dvostruki korijen x1,2 1,2 = 2 i x= 2 i x3 3 = 1, pa je opće rješenje = 1, pa je opće rješenje

ssnn = C = C11 * 2 * 2nn + C + C22 * n * 2 * n * 2nn + C + C3 3 * 1* 1n n

Iz čega slijedi: Iz čega slijedi:

ttnn = C = C11 * n + C * n + C22 * n * log * n * log22 n + C n + C33

Što znači da je prosječna složenost algoritma O(n*lg n)Što znači da je prosječna složenost algoritma O(n*lg n) Nedostatak ovog algoritma sortiranja: potrebno je dodatno polje Nedostatak ovog algoritma sortiranja: potrebno je dodatno polje

Page 17: Sortiranje podataka

1717

Sortiranje pomoću hrpeSortiranje pomoću hrpe

Sortiranje pomoću hrpe (heap sort) se zasniva na svojstvima posebnog Sortiranje pomoću hrpe (heap sort) se zasniva na svojstvima posebnog apstraktnog tipa podataka - hrpi apstraktnog tipa podataka - hrpi

Potpuno binarno stablo T je hrpa (heap) ako su ispunjeni uvjeti:Potpuno binarno stablo T je hrpa (heap) ako su ispunjeni uvjeti:

- čvorovi od T su označeni podacima nekog tipa za koje je definiran - čvorovi od T su označeni podacima nekog tipa za koje je definiran totalni uređajtotalni uređaj

- neka je - neka je ii bilo koji čvor od T. Tada je oznaka od bilo koji čvor od T. Tada je oznaka od ii manja ili jednaka od manja ili jednaka od oznake bilo kojeg djeteta od oznake bilo kojeg djeteta od i – minimalna hrpai – minimalna hrpa

ali može biti isto tako:ali može biti isto tako:

- neka je - neka je ii bilo koji čvor od T. Tada je oznaka od bilo koji čvor od T. Tada je oznaka od ii veća ili jednaka od veća ili jednaka od oznake bilo kojeg djeteta od oznake bilo kojeg djeteta od i –maksimalna hrpai –maksimalna hrpa

Uzlazno sortiranje koje koristi minimalnu hrpu zahtjeva dodatni Uzlazno sortiranje koje koristi minimalnu hrpu zahtjeva dodatni memorijski prostor za spremanje sortirane liste, pa je bolje za taj slučaj memorijski prostor za spremanje sortirane liste, pa je bolje za taj slučaj upotrijebiti maksimalnu hrpuupotrijebiti maksimalnu hrpu

Analogno, za silazno sortiranje je bolje upotrijebiti minimalnu hrpu jer ne Analogno, za silazno sortiranje je bolje upotrijebiti minimalnu hrpu jer ne zahtjeva dodatni memorijski prostor za spremanje elemenata sortirane zahtjeva dodatni memorijski prostor za spremanje elemenata sortirane listeliste

Page 18: Sortiranje podataka

1818

Algoritam: od ulazne liste elemenata se kreira hrpa u kojoj je vrijednost Algoritam: od ulazne liste elemenata se kreira hrpa u kojoj je vrijednost roditelja veća od vrijednosti djece (maksimalna hrpa), pa će u njoj u roditelja veća od vrijednosti djece (maksimalna hrpa), pa će u njoj u korijenu biti najveći element korijenu biti najveći element

Novi se element dodaje u najljevije slobodno mjesto na posljednjoj Novi se element dodaje u najljevije slobodno mjesto na posljednjoj razini stabla, te se uspoređuje njegova vrijednost s vrijednošću razini stabla, te se uspoređuje njegova vrijednost s vrijednošću roditelja, ako je novi element veći, zamjenjuje mjesto s roditeljem. roditelja, ako je novi element veći, zamjenjuje mjesto s roditeljem. Zatim se uspoređuje vrijednost novog elementa koji je sad na Zatim se uspoređuje vrijednost novog elementa koji je sad na pretposljednjoj razini s njegovim trenutnim roditeljem i ako je novi pretposljednjoj razini s njegovim trenutnim roditeljem i ako je novi element veći, opet im se zamjenjuju mjesta, itd. sve dok se na nekoj element veći, opet im se zamjenjuju mjesta, itd. sve dok se na nekoj razini ne nađe roditelj koji je veći od novog elementa ili novi element razini ne nađe roditelj koji je veći od novog elementa ili novi element postane korijen stablapostane korijen stabla

Primjer: 7 3 5 1 8 4 2 9 6 Primjer: 7 3 5 1 8 4 2 9 6

7 7 7 8 7 7 7 8

/ / \ / \ / \/ / \ / \ / \

3 3 5 3 5 7 53 3 5 3 5 7 5

/ / \/ / \

1 1 31 1 3

Page 19: Sortiranje podataka

1919

8 8 98 8 9

/ \ / \ / \/ \ / \ / \

7 5 7 5 8 57 5 7 5 8 5

/ \ / / \ / \ / \ / \/ \ / / \ / \ / \ / \

1 3 4 1 3 4 2 7 3 4 21 3 4 1 3 4 2 7 3 4 2

//

11

99

/ \/ \

8 58 5

/ \ / \/ \ / \

7 3 4 27 3 4 2

/ \/ \

1 6 1 6

Page 20: Sortiranje podataka

2020

Efikasna i jednostavna izvedba hrpe je ona pomoću polja. Ako se korijen Efikasna i jednostavna izvedba hrpe je ona pomoću polja. Ako se korijen stavi u element polja s indeksom 1 i elementi se slažu po razinama, tada stavi u element polja s indeksom 1 i elementi se slažu po razinama, tada će čvor hrpe na poziciji će čvor hrpe na poziciji ii imati lijevo dijete na 2 imati lijevo dijete na 2ii poziciji, a desno na 2 poziciji, a desno na 2ii+1+1

Algoritam punjenja hrpe: ulazni podaci su hrpa H s elementima hAlgoritam punjenja hrpe: ulazni podaci su hrpa H s elementima h11, …, h, …, hnn i i element x, a izlaz je hrpa H’ s n+1 elemenata element x, a izlaz je hrpa H’ s n+1 elemenata

1. stavi x u polje na poziciju h[n+1], 1. stavi x u polje na poziciju h[n+1], ii=n+1=n+1

2. dok je2. dok je i i > 1 i dok je h[ > 1 i dok je h[ii] > h[] > h[ii/2] radi korak 3/2] radi korak 3

3. zamjeni(h[3. zamjeni(h[ii],h[],h[ii/2]), /2]), ii = = ii/2/2 Složenost algoritma: broj elemenata u hrpi je n, jer je hrpa potpuno Složenost algoritma: broj elemenata u hrpi je n, jer je hrpa potpuno

binarno stablo, njena visina je 1+logbinarno stablo, njena visina je 1+log22n. Algoritam zamjenjuje element s n. Algoritam zamjenjuje element s elementom prethodne razine, pa se koraci 2 i 3 ponavljaju najviše logelementom prethodne razine, pa se koraci 2 i 3 ponavljaju najviše log22n n putaputa

Slijedi da je složenost u najgorem slučajuSlijedi da je složenost u najgorem slučaju

TTmaxmax(n) (n) ≤ c≤ c11 + c + c22 * log * log22n = O(lg n)n = O(lg n) Najbolji slučaj: dodani element odmah manji od svog roditelja: Najbolji slučaj: dodani element odmah manji od svog roditelja:

TTminmin(n) (n) ≤ c≤ c11 + c + c22 = O(1) = O(1) Prosječan slučaj: pretpostavlja se da je jednako vjerojatno da će Prosječan slučaj: pretpostavlja se da je jednako vjerojatno da će

novododani element završiti na svakoj od razini stabla, tada je ta novododani element završiti na svakoj od razini stabla, tada je ta vjerojatnost jednaka 1/logvjerojatnost jednaka 1/log22n, pa je složenostn, pa je složenost

Page 21: Sortiranje podataka

2121

)(lg)1(log*2

2

)1(log*log**

log

1**

log

1)(

22

1

222

212

log

1 21

2

nOnc

c

nnc

ncci

ncnT

n

i

pros

algoritam sortiranja pomoću hrpe: korijen, koji je najveći element u hrpi, algoritam sortiranja pomoću hrpe: korijen, koji je najveći element u hrpi, se zamjeni s posljednjim elementom u polju i broj elemenata hrpe se se zamjeni s posljednjim elementom u polju i broj elemenata hrpe se smanji za jedan, te se element koji je sad u korijenu uspoređuje i smanji za jedan, te se element koji je sad u korijenu uspoređuje i zamjenjuje, kad je potrebno, sa svojim potomcima sve dok se opet ne zamjenjuje, kad je potrebno, sa svojim potomcima sve dok se opet ne izgradi hrpa, a na posljednjoj poziciji u polju je zapisan najveći elementizgradi hrpa, a na posljednjoj poziciji u polju je zapisan najveći elementPrimjer: pražnjenje hrpe iz prethodnog primjeraPrimjer: pražnjenje hrpe iz prethodnog primjera

9 9

/ \/ \

8 5 9 ide na zadnje mjesto, 6 u korijen,8 5 9 ide na zadnje mjesto, 6 u korijen,

/ \ / \ preuredi se u hrpu/ \ / \ preuredi se u hrpu

7 3 4 27 3 4 2

/ \/ \

1 6 1 6

Page 22: Sortiranje podataka

2222

8 9 8 9 / \/ \ 7 5 8 ide na predzadnje mjesto, 1 u 7 5 8 ide na predzadnje mjesto, 1 u

korijen,korijen, / \ / \ preuredi se u hrpu/ \ / \ preuredi se u hrpu 6 3 4 26 3 4 2 / / 1 1 7 8, 9 7 8, 9 / \/ \ 6 5 7 ide van, 2 u korijen,6 5 7 ide van, 2 u korijen, / \ / \ preuredi se u hrpu/ \ / \ preuredi se u hrpu 1 3 4 2 1 3 4 2

6 7, 8, 9 6 7, 8, 9 / \/ \ 3 5 6 ide van, 4 u korijen,3 5 6 ide van, 4 u korijen, / \ / preuredi se u hrpu/ \ / preuredi se u hrpu 1 2 4 1 2 4

Page 23: Sortiranje podataka

2323

5 6, 7, 8, 9 5 6, 7, 8, 9 / \/ \ 3 4 5 ide van, 2 u korijen,3 4 5 ide van, 2 u korijen, / \ preuredi se u hrpu/ \ preuredi se u hrpu 1 2 1 2 4 5, 6, 7, 8, 9 4 5, 6, 7, 8, 9 / \/ \ 3 2 4 ide van, 1 u korijen,3 2 4 ide van, 1 u korijen, / preuredi se u hrpu/ preuredi se u hrpu 1 1 3 4, 5, 6, 7, 8, 93 4, 5, 6, 7, 8, 9 / \/ \ 1 2 3 ide van, 2 u korijen1 2 3 ide van, 2 u korijen

2 3, 4, 5, 6, 7, 8, 92 3, 4, 5, 6, 7, 8, 9 / 2 ide van, ostaje 1 koji ide van u zadnjem koraku/ 2 ide van, ostaje 1 koji ide van u zadnjem koraku 11 1, 2, 3, 4, 5, 6, 7, 8, 9 1, 2, 3, 4, 5, 6, 7, 8, 9

Page 24: Sortiranje podataka

2424

Algoritam pražnjenja hrpe: ulaz je hrpa H s elementima hAlgoritam pražnjenja hrpe: ulaz je hrpa H s elementima h11, …, h, …, hnn, izlaz , izlaz je hrpa H’ dobivena od H izbacivanjem korijenaje hrpa H’ dobivena od H izbacivanjem korijena

1. zamjeni(h[1],h[n]), izbaci h[n], 1. zamjeni(h[1],h[n]), izbaci h[n], ii=1=1

2. radi korake 3 i 4 sve dok je 2*2. radi korake 3 i 4 sve dok je 2*i i +1 +1 ≤ n i h[≤ n i h[ii] < max(h[2*] < max(h[2*ii],h[2*],h[2*ii+1]+1]

3. ako je h[2*3. ako je h[2*ii] > h[2*] > h[2*ii+1] zamjeni(h[+1] zamjeni(h[ii],h[2*],h[2*ii]), ]), ii=2*=2*ii

4. inače zamjeni(h[4. inače zamjeni(h[ii],h[2*],h[2*ii+1]), +1]), ii=2*=2*ii+1+1 Složenost algoritma: algoritam mijenja promatrani element s onim na Složenost algoritma: algoritam mijenja promatrani element s onim na

sljedećoj razini, pa se koraci 2 – 4 mogu ponoviti najviše logsljedećoj razini, pa se koraci 2 – 4 mogu ponoviti najviše log22n putan puta

TTmaxmax(n) ≤ c(n) ≤ c11 + c + c22 log log22n = O(lg n)n = O(lg n) U najboljem slučaju je prebačeni element dobar korijen, pa je U najboljem slučaju je prebačeni element dobar korijen, pa je

TTminmin(n) = c(n) = c11 + c + c22 = O(1) = O(1) Prosječan slučaj: jednako je vjerojatno da će prebačeni element Prosječan slučaj: jednako je vjerojatno da će prebačeni element

završiti na bilo kojoj razini, pa je rezultat isti kao kod punjenja hrpezavršiti na bilo kojoj razini, pa je rezultat isti kao kod punjenja hrpe

TTprospros(n) =O(lg n)(n) =O(lg n)

Page 25: Sortiranje podataka

2525

Potpuni algoritam sortiranja pomoću hrpe: ulaz je lista aPotpuni algoritam sortiranja pomoću hrpe: ulaz je lista a11, …, a, …, ann, izlaz , izlaz je sortirana listaje sortirana lista

1. za i = 1, …, n radi korak 21. za i = 1, …, n radi korak 2

2. zovi algoritam punjenja hrpe za element a2. zovi algoritam punjenja hrpe za element aii

3. za i = 1, …, n radi korak 43. za i = 1, …, n radi korak 4 4. zovi algoritam pražnjenja hrpe4. zovi algoritam pražnjenja hrpe Složenost algoritma: za n elemenata u listi, svi koraci se izvršavaju n Složenost algoritma: za n elemenata u listi, svi koraci se izvršavaju n

puta, složenosti za korake 2 i 4 su određene ranijeputa, složenosti za korake 2 i 4 su određene ranije

Složenost za prosječni slučaj za ubacivanje i pražnjenje hrpe su iste Složenost za prosječni slučaj za ubacivanje i pražnjenje hrpe su iste kao za najgori slučaj, pa je i ovdje prosječna složenost O(n*lg n)kao za najgori slučaj, pa je i ovdje prosječna složenost O(n*lg n)

)lg*(log**)(*)(

*log***log**

)log*()log*(

)()()(

221211

2212211

122122

111

1max

1max1max

nnOnneenddc

ennnednnndc

ieeiddc

iTiTcnT

n

i

n

i

n

u

pražnjenjen

i

punjenje

Page 26: Sortiranje podataka

2626

Složenost za najbolji slučajSloženost za najbolji slučaj

)(*)(

)()()(

111

11

111

1min

1min1min

nOnedc

edciTiTcnTn

i

n

i

n

i

punjenjen

i

pražnjenje

Page 27: Sortiranje podataka

2727

Algoritam brzog sortiranjaAlgoritam brzog sortiranja

Algoritam brzog sortiranja (quicksort) je najbrži algoritam za sortiranje, Algoritam brzog sortiranja (quicksort) je najbrži algoritam za sortiranje, koji u prosjeku treba koji u prosjeku treba ΘΘ(n lg n) operacija uspoređivanja za sortiranje (n lg n) operacija uspoređivanja za sortiranje niza duljine nniza duljine n

To je algoritam strategije podijeli pa vladaj, koji dijeli niz u dva podniza To je algoritam strategije podijeli pa vladaj, koji dijeli niz u dva podniza tako da izabere poseban element pivot (stožer) i onda preuredi niz tako tako da izabere poseban element pivot (stožer) i onda preuredi niz tako da se svi elementi manji od pivota prebace na pozicije prije njega, a svi da se svi elementi manji od pivota prebace na pozicije prije njega, a svi veći se nalaze iza pivot elementa, nakon ovog koraka pivot se nalazi na veći se nalaze iza pivot elementa, nakon ovog koraka pivot se nalazi na mjestu na kojem mora biti u sortiranom nizumjestu na kojem mora biti u sortiranom nizu

Postupak se rekurzivno ponavlja za ta dva podniza (manji i veći od Postupak se rekurzivno ponavlja za ta dva podniza (manji i veći od pivota), sve dok se ne dođe do podniza od 1 elementapivota), sve dok se ne dođe do podniza od 1 elementa

Algoritam brzog sortiranja uspoređuje elemente u nizu pa spada u Algoritam brzog sortiranja uspoređuje elemente u nizu pa spada u algoritme sortiranja uspoređivanjemalgoritme sortiranja uspoređivanjem

rezultat je pokušaja ubrzavanja faze spajanja u algoritmu sortiranja rezultat je pokušaja ubrzavanja faze spajanja u algoritmu sortiranja spajanjem (merge sort); ovdje je spajanje u potpunosti izbjegnuto, jer spajanjem (merge sort); ovdje je spajanje u potpunosti izbjegnuto, jer nakon što su elementi u podnizovima sortirani, zbog uređenosti polja, nakon što su elementi u podnizovima sortirani, zbog uređenosti polja, svi su elementi iz drugog podniza veći od svakog elementa iz prvog svi su elementi iz drugog podniza veći od svakog elementa iz prvog podnizapodniza

Izvedba algoritma ovisi o izboru pivot (stožer) elementa: Izvedba algoritma ovisi o izboru pivot (stožer) elementa: najjednostavnija varijanta uzima prvi element za pivot, no on se može najjednostavnija varijanta uzima prvi element za pivot, no on se može odrediti na bilo koji način koji se može izračunati u O(1) vremenuodrediti na bilo koji način koji se može izračunati u O(1) vremenu

Page 28: Sortiranje podataka

2828

Razmotrimo slučaj kad je pivot prvi element u nizu. Za premještanje Razmotrimo slučaj kad je pivot prvi element u nizu. Za premještanje elemenata niza potrebna su dva kursora, prvi je iniciran na drugi elemenata niza potrebna su dva kursora, prvi je iniciran na drugi element u nizu i raste, a drugi na zadnji i padaelement u nizu i raste, a drugi na zadnji i pada

Kreće se s prvim kursorom koji se pomiče sve dok se ne nađe element Kreće se s prvim kursorom koji se pomiče sve dok se ne nađe element veći od pivota, tada se kreće od drugog kursora koji se pomiče dok se veći od pivota, tada se kreće od drugog kursora koji se pomiče dok se ne nađe element manji od kursorane nađe element manji od kursora

Zamijene se mjesta ta dva elementa i nastavlja se traženje od prvog Zamijene se mjesta ta dva elementa i nastavlja se traženje od prvog kursorakursora

Pretraživanje završava kad je prvi kursor iza drugoga, tada drugi kursor Pretraživanje završava kad je prvi kursor iza drugoga, tada drugi kursor pokazuje na poziciju na kojoj će u sortiranom nizu biti pivot element, pa pokazuje na poziciju na kojoj će u sortiranom nizu biti pivot element, pa se zamijene mjesta tog elementa i pivot elementase zamijene mjesta tog elementa i pivot elementa

Nakon toga se ponavlja postupak na dva podniza: za elemente prije Nakon toga se ponavlja postupak na dva podniza: za elemente prije pivot elementa i one iza pivot elementapivot elementa i one iza pivot elementa

Primjer: 7 3 5 1 8 4 2 9 6 , pivot je 7Primjer: 7 3 5 1 8 4 2 9 6 , pivot je 7 Kreće se od početka, prvi element veći od 7 je 8, sa stražnje strane prvi Kreće se od početka, prvi element veći od 7 je 8, sa stražnje strane prvi

manji je 6, pa im se zamijene mjesta:manji je 6, pa im se zamijene mjesta:

7 3 5 1 6 4 2 9 8 7 3 5 1 6 4 2 9 8 Sljedeći element veći od 7 je 9, odostraga prvi manji je 2. No drugi Sljedeći element veći od 7 je 9, odostraga prvi manji je 2. No drugi

kursor je ispred prvog pa ovaj korak završava. Niz se dijeli na dva dijela, kursor je ispred prvog pa ovaj korak završava. Niz se dijeli na dva dijela, od početka do drugog kursora, te od prvog kursora do krajaod početka do drugog kursora, te od prvog kursora do kraja

Page 29: Sortiranje podataka

2929

7 3 5 1 6 4 2 || 9 87 3 5 1 6 4 2 || 9 8 Pivot i element na koji pokazuje drugi kursor zamijene mjesta, kako Pivot i element na koji pokazuje drugi kursor zamijene mjesta, kako

su svi elementi u prvoj listi manji od njega, on je na pravom mjestu i su svi elementi u prvoj listi manji od njega, on je na pravom mjestu i više ga se ne diraviše ga se ne dira

2 3 5 1 6 4 || 7 || 9 82 3 5 1 6 4 || 7 || 9 8 Ponavljanje postupka na prvom podnizu: pivot je 2, sprijeda prvi veći Ponavljanje postupka na prvom podnizu: pivot je 2, sprijeda prvi veći

od njega je 3, straga prvi manji je 1od njega je 3, straga prvi manji je 1

2 1 5 3 6 4 || 7 || 9 82 1 5 3 6 4 || 7 || 9 8 Nastavljamo: sprijeda 5, straga 1, ali je prvi kursor iza drugoga, pa se Nastavljamo: sprijeda 5, straga 1, ali je prvi kursor iza drugoga, pa se

mijenjaju pivot i element na koji pokazuje drugi kursormijenjaju pivot i element na koji pokazuje drugi kursor

1 || 2 || 5 3 6 4 || 7 || 9 81 || 2 || 5 3 6 4 || 7 || 9 8 Drugi podniz (zadnja 2 elementa): pivot je 9 prvi kursor ne nalazi veći Drugi podniz (zadnja 2 elementa): pivot je 9 prvi kursor ne nalazi veći

od njega nego prelazi drugi kursor, pa 9 i 8 mijenjaju mjesta:od njega nego prelazi drugi kursor, pa 9 i 8 mijenjaju mjesta:

1 || 2 || 5 3 6 4 || 7 || 8 || 91 || 2 || 5 3 6 4 || 7 || 8 || 9 Jedini preostao niz je u sredini: pivot je 5, sprijeda nalazimo 6, straga Jedini preostao niz je u sredini: pivot je 5, sprijeda nalazimo 6, straga

44

1 || 2 || 5 3 4 6 || 7 || 8 || 91 || 2 || 5 3 4 6 || 7 || 8 || 9 Sprijeda nalazimo 6 i sad je prvi kursor iza drugog: 5 i 4 zamijene Sprijeda nalazimo 6 i sad je prvi kursor iza drugog: 5 i 4 zamijene

mjestamjesta

Page 30: Sortiranje podataka

3030

1 || 2 || 4 3 || 5 || 6 || 7 || 8 || 91 || 2 || 4 3 || 5 || 6 || 7 || 8 || 9 Zadnji korak: niz od 2 elementa, pivot je 4, pretraga sprijeda ne nalazi Zadnji korak: niz od 2 elementa, pivot je 4, pretraga sprijeda ne nalazi

veći od njega nego se prvi kursor pomiče iza drugog:veći od njega nego se prvi kursor pomiče iza drugog:

1 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 91 || 2 || 3 || 4 || 5 || 6 || 7 || 8 || 9 Algoritam brzog sortiranja: ulaz je lista aAlgoritam brzog sortiranja: ulaz je lista a11, … a, … ann i kursori i kursori ii (početak) i (početak) i jj

(kraj),a izlaz sortirana lista(kraj),a izlaz sortirana lista

1. k = i+1, l = j1. k = i+1, l = j

2. sve dok je k <= l radi korake 3 – 52. sve dok je k <= l radi korake 3 – 5

3. dok je ((k<=l) i (a3. dok je ((k<=l) i (aii >= a >= akk)) k = k+1)) k = k+1

4. dok je ((k<=l) i (a4. dok je ((k<=l) i (aii <= a <= all)) l = l-1)) l = l-1

5. ako je k < l, zamjeni(a5. ako je k < l, zamjeni(akk, a, all))

6. ako je l > i zamjeni(a6. ako je l > i zamjeni(aii, a, all))

7. ako je l > i quicksort(a, i, l-1)7. ako je l > i quicksort(a, i, l-1)

8. ako je k < j quicksort(a, k, j) 8. ako je k < j quicksort(a, k, j) Najgori slučaj za ovaj algoritam: već sortirana lista i lista sortirana Najgori slučaj za ovaj algoritam: već sortirana lista i lista sortirana

obrnutim rasporedom. Tada se u svakom koraku lista dijeli na obrnutim rasporedom. Tada se u svakom koraku lista dijeli na podliste od jednog i n-1 elemenata podliste od jednog i n-1 elemenata

Page 31: Sortiranje podataka

3131

Korak 1. ima konstantnu složenost, koraci od 2. do 5. (za niz duljine n) Korak 1. ima konstantnu složenost, koraci od 2. do 5. (za niz duljine n) imaju složenost cimaju složenost c11 + c + c22 * n, a korak 6. ima konstantnu složenost * n, a korak 6. ima konstantnu složenost

TTmaxmax(n) = T(n) = Tmaxmax(n-1) + d(n-1) + d11 * n + d * n + d22

rekurzija rekurzija

ttnn = t = tn-1n-1 + d + d11 * n + d * n + d22

Oduzme se izraz za n-1 član od izraza za n-ti član i srediOduzme se izraz za n-1 član od izraza za n-ti član i sredi

ttnn = 2 * t = 2 * tn-1n-1 – t – tn-2n-2 + d + d11

Sada se opet oduzme jdba za n-1 član od jdbe za n-ti član i izlaziSada se opet oduzme jdba za n-1 član od jdbe za n-ti član i izlazi

ttnn = 3 * t = 3 * tn-1n-1 – 3 * t – 3 * tn-2n-2 + t + tn-3n-3

Karakteristična jdbaKarakteristična jdba

xx33 – 3 * x – 3 * x22 + 3 * x - 1 = 0 + 3 * x - 1 = 0 Jedan trostruki korijen xJedan trostruki korijen x1,2,31,2,3 = 1, pa je opće rješenje rekurzije = 1, pa je opće rješenje rekurzije

ttnn = C = C11 * 1 * 1nn + C + C22 * n * 1 * n * 1nn + C + C33 * n * n22 * 1 * 1nn

ttnn = C = C11 + C + C22 * n + C * n + C33 * n * n22 Dakle, u najgorem slučaju, složenost je O(nDakle, u najgorem slučaju, složenost je O(n22))

Page 32: Sortiranje podataka

3232

Najbolji slučaj: kada je izabrani pivot srednja vrijednost elemenata dijela Najbolji slučaj: kada je izabrani pivot srednja vrijednost elemenata dijela liste koji se promatra, pa se lista dijeli na dva dijela jednake duljine liste koji se promatra, pa se lista dijeli na dva dijela jednake duljine

TTminmin(n) (n) ≤ 2 * ≤ 2 * TTminmin(n/2) + d(n/2) + d11 * n + d * n + d22

Tj. rekurzija koja se rješava jeTj. rekurzija koja se rješava je

ttnn ≤ 2 * ≤ 2 * ttn/2n/2 + d + d11 * n + d * n + d22

Uvodi se supstitucijaUvodi se supstitucija

Izraz za n-1 član se oduzme od izraza za n-ti članIzraz za n-1 član se oduzme od izraza za n-ti član

ssnn = 3 * s = 3 * sn-1n-1 – 2 * s – 2 * sn-2n-2 + d + d11 * 2 * 2n-1n-1

Od ovog izraza se dvostruka formula za n-1 članOd ovog izraza se dvostruka formula za n-1 član

ssnn = 5 * s = 5 * sn-1n-1 – 8 * s – 8 * sn-2n-2 + 4 * s + 4 * sn-3n-3

ntsn 2

211

21221

2

22

2**2

2**22**2 1

dds

ddtddtts

nn

nnn nnn

Page 33: Sortiranje podataka

3333

Karakteristična jdba xKarakteristična jdba x33 – 5 * x – 5 * x22 + 8 * x - 4 = 0 ima jednostruki korijen x + 8 * x - 4 = 0 ima jednostruki korijen x11 = = 1 i dvostruki korijen x1 i dvostruki korijen x2,32,3 = 2, pa je opće rješenje rekurzije = 2, pa je opće rješenje rekurzije

ssnn = C = C11 * 1 * 1nn + C + C22 * 2 * 2nn + C + C33 * n * 2 * n * 2nn

ssnn = C = C11 + C + C22 * 2 * 2nn + C + C33 * n * 2 * n * 2nn

Povratkom iz supstitucije izlaziPovratkom iz supstitucije izlazi

ttnn = C = C11 + C + C22 * n + C * n + C33 * n * log * n * log22nn Pa je dakle složenost u najboljem slučaju O(n*lg n)Pa je dakle složenost u najboljem slučaju O(n*lg n) Složenost prosječnog slučaja: pretpostavlja se da je svaki raspored Složenost prosječnog slučaja: pretpostavlja se da je svaki raspored

elemenata liste jednako vjerojatan. Brojat ćemo samo operacije elemenata liste jednako vjerojatan. Brojat ćemo samo operacije uspoređivanja nad elementima polja (broj svih ostalih operacija ovisi o broju uspoređivanja nad elementima polja (broj svih ostalih operacija ovisi o broju tih operacija, pa one određuju složenost algoritma). Također se tih operacija, pa one određuju složenost algoritma). Također se pretpostavlja da su svi elementi u polju različiti, te da je jednaka pretpostavlja da su svi elementi u polju različiti, te da je jednaka vjerojatnost izbora svakog elementa za pivotavjerojatnost izbora svakog elementa za pivota

Gleda se segment liste aGleda se segment liste amm, …, a, …, app, kako su za izbor pivot elementa svi , kako su za izbor pivot elementa svi elementi iz segmenta jednako vjerojatni, prolaz algoritma uz izbor nekog aelementi iz segmenta jednako vjerojatni, prolaz algoritma uz izbor nekog a ii za pivota dijeli segment na dva dijela aza pivota dijeli segment na dva dijela amm, …, a, …, am+i-2m+i-2 i a i am+im+i, …, a, …, app s s vjerojatnošću 1/(p-m+1)vjerojatnošću 1/(p-m+1)

Složenost u prosječnom slučaju (algoritam radi n+1 koraka prije Složenost u prosječnom slučaju (algoritam radi n+1 koraka prije rekurzivnog poziva) je daklerekurzivnog poziva) je dakle

n

i

prosprospros inTiTn

nnT1

))()1((*1

1)(

Page 34: Sortiranje podataka

3434

Rješava se rekurzijaRješava se rekurzija

Kad se jdba pomnoži s n i srede dvije sume, slijediKad se jdba pomnoži s n i srede dvije sume, slijedi

Od gornjeg izraza se oduzme izraz za n-1, nakon sređivanja slijedi Od gornjeg izraza se oduzme izraz za n-1, nakon sređivanja slijedi

n * tn * tnn = (n + 1) * t = (n + 1) * tn-1n-1 +2 * n +2 * n Dijeljenjem izraza s n(n+1) slijediDijeljenjem izraza s n(n+1) slijedi

Rekurzivnim uvrštavanjem ovog izraza slijedi izrazRekurzivnim uvrštavanjem ovog izraza slijedi izraz

n

iinin ntt

nt

11 1)(*

1

1

0

)1(**2*n

iin nnttn

1

2

11

nn

t

n

t nn

Page 35: Sortiranje podataka

3535

1

3

1 1*2

21

n

i

n

i

t

n

t

2ln)1ln(11

3

ni

n

i

Poznato je da vrijedi:Poznato je da vrijedi:

Uvrštavanjem i sređivanjem slijediUvrštavanjem i sređivanjem slijedi

ttnn ≤ 2 * (n + 1) * [ln(n+1) – ln 2 + k]≤ 2 * (n + 1) * [ln(n+1) – ln 2 + k]

tj. tj.

TTprospros = O(n * lg n) = O(n * lg n)

ovaj algoritam je stvarno efikasan i isplatljiv za sortiranje dugačkih ovaj algoritam je stvarno efikasan i isplatljiv za sortiranje dugačkih nizova elemenata i uz pažljiv izbor pivot elementanizova elemenata i uz pažljiv izbor pivot elementa Izvedba algoritma brzog sortiranja je znatno složenija od recimo Izvedba algoritma brzog sortiranja je znatno složenija od recimo sortiranja umetanjem, što znači da su konstante koje se javljaju u izrazu sortiranja umetanjem, što znači da su konstante koje se javljaju u izrazu vremenske složenosti znatno veće od konstanti za sortiranje umetanjem. vremenske složenosti znatno veće od konstanti za sortiranje umetanjem. Zbog toga će za kratke nizove sortiranje umetanjem biti bržeZbog toga će za kratke nizove sortiranje umetanjem biti brže

Page 36: Sortiranje podataka

3636

Usporedba algoritama sortiranjaUsporedba algoritama sortiranja

Primjer programa u kojem se uspoređuju brzine izvršavanja sljedećih Primjer programa u kojem se uspoređuju brzine izvršavanja sljedećih algoritama sortiranja:algoritama sortiranja:

1) sortiranje izborom (selection sort) – pronađe se najmanji element 1) sortiranje izborom (selection sort) – pronađe se najmanji element u nizu i stavi se na prvo mjesto (zamijene se mjesta najmanjeg i u nizu i stavi se na prvo mjesto (zamijene se mjesta najmanjeg i prvog), pa se postupak ponavlja za preostale elemente na kraćim prvog), pa se postupak ponavlja za preostale elemente na kraćim listamalistama

2) mjehuričasto sortiranje (bubble sort) – svaki element se usporedi 2) mjehuričasto sortiranje (bubble sort) – svaki element se usporedi sa sljedbenikom, veći uvijek ide otraga, na kraju prvog koraka najveći sa sljedbenikom, veći uvijek ide otraga, na kraju prvog koraka najveći element za zadnjem mjestu, postupak se ponavlja za kraću listuelement za zadnjem mjestu, postupak se ponavlja za kraću listu

3) poboljšano mjehuričasto sortiranje: ako nema zamjene elemenata 3) poboljšano mjehuričasto sortiranje: ako nema zamjene elemenata u nekom i-tom koraku, znači da je ostatak liste sortiranu nekom i-tom koraku, znači da je ostatak liste sortiran

4) sortiranje umetanjem (insertion sort) – niz se dijeli na već sortiran i 4) sortiranje umetanjem (insertion sort) – niz se dijeli na već sortiran i još nesortiran podniz, u prvom koraku je u prvom podnizu samo prvi još nesortiran podniz, u prvom koraku je u prvom podnizu samo prvi element, u svakom koraku se uzima prvi element iz drugog podniza i element, u svakom koraku se uzima prvi element iz drugog podniza i uspoređuje s elementima u prvom podnizu dok se ne nađe pozicija na uspoređuje s elementima u prvom podnizu dok se ne nađe pozicija na kojoj mora bitikojoj mora biti

Page 37: Sortiranje podataka

3737

5) Shellovo sortiranje - sortiranje kraćih podnizova u koracima 5) Shellovo sortiranje - sortiranje kraćih podnizova u koracima upotrebom sortiranja umetanjemupotrebom sortiranja umetanjem

6) sortiranje pomoću hrpe (heapsort) – zasniva se na specijalnom 6) sortiranje pomoću hrpe (heapsort) – zasniva se na specijalnom svojstvu hrpe da je roditelj uvijek veći (manji) od potomakasvojstvu hrpe da je roditelj uvijek veći (manji) od potomaka

7) sortiranje spajanjem (merge sort) – algoritam podijeli-pa-vladaj, 7) sortiranje spajanjem (merge sort) – algoritam podijeli-pa-vladaj, rekurzivno dijeli niz na podnizove i sortirane podnizove spaja u rekurzivno dijeli niz na podnizove i sortirane podnizove spaja u konačni sortirani nizkonačni sortirani niz

8) brzo sortiranje (quicksort) – poboljšano sortiranje spajanjem u 8) brzo sortiranje (quicksort) – poboljšano sortiranje spajanjem u kojem je izbjegnut sam proces spajanja podnizova; rekurzivni kojem je izbjegnut sam proces spajanja podnizova; rekurzivni postupak u kojem se izabire pivot (stožerni) element koji se postupak u kojem se izabire pivot (stožerni) element koji se uspoređuje sa preostalim elementima, manji od njega se stavljaju prije uspoređuje sa preostalim elementima, manji od njega se stavljaju prije pivota, a veći izapivota, a veći iza

Generiranje niza za sortiranje: elementi niza su indeksi polja, Generiranje niza za sortiranje: elementi niza su indeksi polja, razbacaju se po polju upotrebom generatora slučajnih brojevarazbacaju se po polju upotrebom generatora slučajnih brojeva

Svaki algoritam sortiranja se testira na razbacanom i sortiranom nizu i Svaki algoritam sortiranja se testira na razbacanom i sortiranom nizu i mjeri se vrijeme izvršavanja algoritmamjeri se vrijeme izvršavanja algoritma

Page 38: Sortiranje podataka

3838

#include <stdlib.h>#include <stdlib.h>#include <stdio.h>#include <stdio.h>#include <string.h>#include <string.h>#include <time.h>#include <time.h>#include <sys\timeb.h>#include <sys\timeb.h>typedef int tip;typedef int tip;

// vrijeme u ms// vrijeme u msint Trajanje (struct timeb *vrijeme1) {int Trajanje (struct timeb *vrijeme1) { struct timeb vrijeme2;struct timeb vrijeme2; ftime (&vrijeme2);ftime (&vrijeme2); return 1000 * (vrijeme2.time - vrijeme1->time) +return 1000 * (vrijeme2.time - vrijeme1->time) + vrijeme2.millitm - vrijeme1->millitm;vrijeme2.millitm - vrijeme1->millitm;}}

/// ispis poruke i prekid programa/ ispis poruke i prekid programavoid Fatalno (char *niz) {void Fatalno (char *niz) { printf ("\n %s \n", niz);printf ("\n %s \n", niz);

exit (1);exit (1);}}

Page 39: Sortiranje podataka

3939

// zamjena vrijednosti *lijevo i *desno// zamjena vrijednosti *lijevo i *desno__inline void Zamijeni (tip *lijevo, tip *desno) {__inline void Zamijeni (tip *lijevo, tip *desno) { tip pom = *lijevo;tip pom = *lijevo; *lijevo = *desno;*lijevo = *desno; *desno = pom;*desno = pom;}}

// sort// sortiranje izboromiranje izboromvoid SelectionSort (tip A [], int N) {void SelectionSort (tip A [], int N) {

int i, j, min;int i, j, min;for (i = 0; i < N; i++) {for (i = 0; i < N; i++) {

min = i;min = i; for (j = i+1; j < N; j++) {for (j = i+1; j < N; j++) { if (A[j] < A[min]) min = j;if (A[j] < A[min]) min = j;

}}Zamijeni(&A[i], &A[min]);Zamijeni(&A[i], &A[min]);

}}}}

Page 40: Sortiranje podataka

4040

// mjehuricast// mjehuricastoo sort sortiranjeiranjevoid BubbleSort (tip A [], int N) {void BubbleSort (tip A [], int N) {

int i, j;int i, j;for (i = 0; i < N-1; i++) {for (i = 0; i < N-1; i++) {

for (j = 0; j < N-1-i; j++) {for (j = 0; j < N-1-i; j++) { if (A[j+1] < A[j]) Zamijeni (&A[j], &A[j+1]);if (A[j+1] < A[j]) Zamijeni (&A[j], &A[j+1]);

}}}}

}}

////poboljšanopoboljšano mjehuricast mjehuricastoo sort sortiranjeiranje void BubbleSortPoboljsani (tip A [], int N) {void BubbleSortPoboljsani (tip A [], int N) {

int i, j, BilaZamjena;int i, j, BilaZamjena;for (i = 0, BilaZamjena = 1; BilaZamjena; i++) {for (i = 0, BilaZamjena = 1; BilaZamjena; i++) {

BilaZamjena = 0;BilaZamjena = 0; for (j = 0; j < N-1-i; j++) {for (j = 0; j < N-1-i; j++) { if (A[j+1] < A[j]) {if (A[j+1] < A[j]) {

Zamijeni (&A[j], &A[j+1]);Zamijeni (&A[j], &A[j+1]);BilaZamjena = 1;BilaZamjena = 1;

}}}}

}}}}

Page 41: Sortiranje podataka

4141

// sort// sortiranje umetanjemiranje umetanjemvoid InsertionSort (tip A [], int N) {void InsertionSort (tip A [], int N) { int i, j;int i, j; tip pom;tip pom; for (i = 1; i < N; i++) {for (i = 1; i < N; i++) { pom = A[i];pom = A[i]; for (j = i; j >= 1 && A[j-1] > pom; j--)for (j = i; j >= 1 && A[j-1] > pom; j--) A[j] = A[j-1];A[j] = A[j-1]; A[j] = pom; }A[j] = pom; }}}

// Shell// Shellovoovo sort sortiranjeiranjevoid ShellSort (tip A [], int N) {void ShellSort (tip A [], int N) { int i, j, korak;int i, j, korak; tip pom;tip pom; for (korak = N / 2; korak > 0; korak /= 2) { // Insertion sort s veaim korakomfor (korak = N / 2; korak > 0; korak /= 2) { // Insertion sort s veaim korakom for (i = korak; i < N; i++) {for (i = korak; i < N; i++) { pom = A [i];pom = A [i]; for (j = i; j >= korak && A[j-korak] > pom; j -= korak) {for (j = i; j >= korak && A[j-korak] > pom; j -= korak) {

A [j] = A [j - korak]; }A [j] = A [j - korak]; } A [j] = pom; } }A [j] = pom; } }}}

Page 42: Sortiranje podataka

4242

// // podešavanje hrpepodešavanje hrpevoid Podesi (tip A[], int i, int n) {void Podesi (tip A[], int i, int n) { int j;int j; tip stavka;tip stavka; j = 2*i;j = 2*i; stavka = A[i];stavka = A[i]; while (j <= n ) {while (j <= n ) { if ((j < n) && (A[j] < A[j+1])) j++;if ((j < n) && (A[j] < A[j+1])) j++; if (stavka >= A[j]) break;if (stavka >= A[j]) break; A[j/2] = A[j];A[j/2] = A[j]; j *=2; }j *=2; } A[j/2] = stavka;A[j/2] = stavka; }}// inicijalno stvaranje // inicijalno stvaranje hrpehrpevoid StvoriGomilu (tip A[], int n) {void StvoriGomilu (tip A[], int n) { int i;int i; for (i = n/2; i >= 1; i--) Podesi (A, i, n);for (i = n/2; i >= 1; i--) Podesi (A, i, n); }}// // sortiranje pomoću hrpesortiranje pomoću hrpevoid HeapSort (tip A[], int n) { // A[1:n] sadrzi podatke koje treba sortirativoid HeapSort (tip A[], int n) { // A[1:n] sadrzi podatke koje treba sortirati int i;int i; StvoriGomilu (A, n);StvoriGomilu (A, n); for (i = n; i >= 2; i--) {// Zamijeni korijen i zadnji list, skrati polje za 1 i podesi for (i = n; i >= 2; i--) {// Zamijeni korijen i zadnji list, skrati polje za 1 i podesi

hrphrpuuZamijeni (&A[1], &A[i]);Zamijeni (&A[1], &A[i]);

Podesi (A, 1, i-1);Podesi (A, 1, i-1); }}}}

Page 43: Sortiranje podataka

4343

//// udruzivanje LPoz:LijeviKraj i DPoz:DesniKraj udruzivanje LPoz:LijeviKraj i DPoz:DesniKrajvoid Merge (tip A [], tip PomPolje [], int LPoz, int DPoz, int DesniKraj) {void Merge (tip A [], tip PomPolje [], int LPoz, int DPoz, int DesniKraj) { int i, LijeviKraj, BrojClanova, PomPoz;int i, LijeviKraj, BrojClanova, PomPoz; LijeviKraj = DPoz - 1;LijeviKraj = DPoz - 1; PomPoz = LPoz;PomPoz = LPoz; BrojClanova = DesniKraj - LPoz + 1; BrojClanova = DesniKraj - LPoz + 1; while (LPoz <= LijeviKraj && DPoz <= DesniKraj) {// glavna peljawhile (LPoz <= LijeviKraj && DPoz <= DesniKraj) {// glavna pelja if (A [LPoz] <= A [DPoz])if (A [LPoz] <= A [DPoz]) PomPolje [PomPoz++] = A [LPoz++];PomPolje [PomPoz++] = A [LPoz++]; elseelse

PomPolje [PomPoz++] = A [DPoz++]; }PomPolje [PomPoz++] = A [DPoz++]; } while (LPoz <= LijeviKraj) // Kopiraj ostatak prve polovicewhile (LPoz <= LijeviKraj) // Kopiraj ostatak prve polovice PomPolje [PomPoz++] = A [LPoz++];PomPolje [PomPoz++] = A [LPoz++]; while (DPoz <= DesniKraj) // Kopiraj ostatak druge polovicewhile (DPoz <= DesniKraj) // Kopiraj ostatak druge polovice PomPolje [PomPoz++] = A [DPoz++];PomPolje [PomPoz++] = A [DPoz++]; for (i = 0; i < BrojClanova; i++, DesniKraj--) // Kopiraj PomPolje natragfor (i = 0; i < BrojClanova; i++, DesniKraj--) // Kopiraj PomPolje natrag A [DesniKraj] = PomPolje [DesniKraj];A [DesniKraj] = PomPolje [DesniKraj]; }}// MergeSort - rekurzivno sortiranje podpolja// MergeSort - rekurzivno sortiranje podpoljavoid MSort (tip A [], tip PomPolje[], int lijevo, int desno ) {void MSort (tip A [], tip PomPolje[], int lijevo, int desno ) { int sredina;int sredina; if (lijevo < desno) { sredina = (lijevo + desno) / 2;if (lijevo < desno) { sredina = (lijevo + desno) / 2; MSort (A, PomPolje, lijevo, sredina);MSort (A, PomPolje, lijevo, sredina); MSort (A, PomPolje, sredina + 1, desno);MSort (A, PomPolje, sredina + 1, desno); Merge (A, PomPolje, lijevo, sredina + 1, desno); }Merge (A, PomPolje, lijevo, sredina + 1, desno); } }}

Page 44: Sortiranje podataka

4444

//sort//sortiranje spajanjemiranje spajanjemvoid MergeSort (tip A [], int N) {void MergeSort (tip A [], int N) { tip *PomPolje;tip *PomPolje; PomPolje = malloc (N * sizeof (tip));PomPolje = malloc (N * sizeof (tip)); if (PomPolje != NULL) {if (PomPolje != NULL) { MSort (A, PomPolje, 0, N - 1);MSort (A, PomPolje, 0, N - 1); free (PomPolje);free (PomPolje); } else} else

Fatalno ("Nema mjesta za PomPolje!");Fatalno ("Nema mjesta za PomPolje!");}}

// QuickSort - // QuickSort - vvrati medijan od lijevo, sredina i desno, poredaj ih i sakrij stozerrati medijan od lijevo, sredina i desno, poredaj ih i sakrij stozertip medijan3 (tip A [], int lijevo, int desno) {tip medijan3 (tip A [], int lijevo, int desno) { int sredina = (lijevo + desno) / 2;int sredina = (lijevo + desno) / 2; if (A [lijevo] > A [sredina])if (A [lijevo] > A [sredina]) Zamijeni (&A[lijevo], &A[sredina]);Zamijeni (&A[lijevo], &A[sredina]); if (A [lijevo] > A [desno])if (A [lijevo] > A [desno]) Zamijeni (&A [lijevo], &A [desno]);Zamijeni (&A [lijevo], &A [desno]); if (A [sredina] > A [desno])if (A [sredina] > A [desno]) Zamijeni (&A [sredina], &A [desno]); // Sada je: Zamijeni (&A [sredina], &A [desno]); // Sada je:

A[lijevo]<=A[sredina]<=A[desno]A[lijevo]<=A[sredina]<=A[desno] Zamijeni (&A [sredina], &A [desno - 1]); // Vrati stozerZamijeni (&A [sredina], &A [desno - 1]); // Vrati stozer return A [desno - 1];return A [desno - 1];}}

Page 45: Sortiranje podataka

4545

// QuickSort - rekurzivno sortiranje podpolja// QuickSort - rekurzivno sortiranje podpolja#define Cutoff (3)#define Cutoff (3)void Qsort (tip A [], int lijevo, int desno) {void Qsort (tip A [], int lijevo, int desno) { int i, j;int i, j; tip stozer;tip stozer; if (lijevo + Cutoff <= desno) {if (lijevo + Cutoff <= desno) { stozer = medijan3 (A, lijevo, desno);stozer = medijan3 (A, lijevo, desno); i = lijevo; j = desno - 1;i = lijevo; j = desno - 1; while (1) {while (1) { while (A [++i] < stozer);while (A [++i] < stozer); while (A [--j] > stozer);while (A [--j] > stozer); if (i < j)if (i < j) Zamijeni (&A [i], &A [j]);Zamijeni (&A [i], &A [j]); elseelse break; } // Obnovi stozerbreak; } // Obnovi stozer Zamijeni (&A [i], &A [desno - 1]);Zamijeni (&A [i], &A [desno - 1]); Qsort (A, lijevo, i - 1);Qsort (A, lijevo, i - 1); Qsort (A, i + 1, desno);Qsort (A, i + 1, desno); } else { // Sortiraj podpolje} else { // Sortiraj podpolje InsertionSort (A + lijevo, desno - lijevo + 1); }}InsertionSort (A + lijevo, desno - lijevo + 1); }}// // brzo sortiranjebrzo sortiranjevoid QuickSort (tip A [], int N) {void QuickSort (tip A [], int N) { Qsort (A, 0, N - 1);}Qsort (A, 0, N - 1);}

Page 46: Sortiranje podataka

4646

// generira podatke za sort// generira podatke za sortvoid Generiraj (tip A [], int N) {void Generiraj (tip A [], int N) { int i;int i;

srand ((unsigned) time (NULL));srand ((unsigned) time (NULL));// vrijednosti elemenata kao vrijednosti njihovih indeksa// vrijednosti elemenata kao vrijednosti njihovih indeksa

for( i = 0; i < N; i++ ) A [i] = i;for( i = 0; i < N; i++ ) A [i] = i;// promijesaj vrijednosti// promijesaj vrijednosti

for( i = 1; i < N; i++ )for( i = 1; i < N; i++ ) Zamijeni (&A [i], &A [rand () % (i + 1)]);Zamijeni (&A [i], &A [rand () % (i + 1)]);}}

// provjeri da li svi elementi imaju vrijednost jednaku indeksu// provjeri da li svi elementi imaju vrijednost jednaku indeksuvoid ProvjeriSort (tip A [], int N) {void ProvjeriSort (tip A [], int N) { int i, flag = 0;int i, flag = 0; for (i = 0; i < N; i++) {for (i = 0; i < N; i++) { if (A[i] != i) {if (A[i] != i) { printf( "Sort ne radi: %d %d\n", i, A [i]);printf( "Sort ne radi: %d %d\n", i, A [i]);

flag = 1;flag = 1;}}

}} if (!flag) printf( "Provjera zavrsena: sort OK\n" );if (!flag) printf( "Provjera zavrsena: sort OK\n" );}}

Page 47: Sortiranje podataka

4747

// kopira polje desno[] u polje lijevo[]// kopira polje desno[] u polje lijevo[]void Kopiraj (tip lijevo [], tip desno [], int N) {void Kopiraj (tip lijevo [], tip desno [], int N) { int i;int i; for (i = 0; i < N; i++) lijevo [i] = desno [i];for (i = 0; i < N; i++) lijevo [i] = desno [i]; }}// pokretanje potprograma za sort// pokretanje potprograma za sortvoid TestSorta (tip A[], tip B[], int N, char *ImeSorta, void (*Sort) (tip A[], int N)) void TestSorta (tip A[], tip B[], int N, char *ImeSorta, void (*Sort) (tip A[], int N))

{{// A - polje koje se sortira// A - polje koje se sortira// B - polje s podacima za sort// B - polje s podacima za sort// N - broj clanova polja// N - broj clanova polja// ImeSorta - naziv algoritma// ImeSorta - naziv algoritma// Sort - pokazivac na funkciju koja obavlja sort// Sort - pokazivac na funkciju koja obavlja sort

struct timeb Vrijeme1;struct timeb Vrijeme1;Kopiraj (A, B, N);Kopiraj (A, B, N); // kopiraj podatke iz B u A// kopiraj podatke iz B u A

// sortiraj i mjeri vrijeme// sortiraj i mjeri vrijeme printf ("%s...\n", ImeSorta);printf ("%s...\n", ImeSorta); ftime (&Vrijeme1);ftime (&Vrijeme1);

if (strcmp(ImeSorta, "Heap Sort") == 0) {if (strcmp(ImeSorta, "Heap Sort") == 0) { Sort (A-1, N); // da HeapSort "vidi" A[0] kao A[1]Sort (A-1, N); // da HeapSort "vidi" A[0] kao A[1]

} else {} else {Sort (A, N);Sort (A, N); }}

printf ("Trajanje: %d ms\n", Trajanje(&Vrijeme1));printf ("Trajanje: %d ms\n", Trajanje(&Vrijeme1)); ProvjeriSort (A, N);ProvjeriSort (A, N);

Page 48: Sortiranje podataka

4848

// sortiraj prethodno sortirano polje A// sortiraj prethodno sortirano polje A printf ("%s sortiranog polja...\n", ImeSorta);printf ("%s sortiranog polja...\n", ImeSorta);

ftime (&Vrijeme1);ftime (&Vrijeme1);if (strcmp(ImeSorta, "Heap Sort") == 0) {if (strcmp(ImeSorta, "Heap Sort") == 0) {

Sort (A-1, N);Sort (A-1, N);} else {} else {

Sort (A, N);Sort (A, N);}}

printf ("Trajanje: %d ms\n", Trajanje(&Vrijeme1));printf ("Trajanje: %d ms\n", Trajanje(&Vrijeme1)); ProvjeriSort (A, N);ProvjeriSort (A, N);

printf ("Pritisni bilo koju tipku...\n\n");printf ("Pritisni bilo koju tipku...\n\n");getchar()getchar();;

}}

Page 49: Sortiranje podataka

4949

void main (void) {void main (void) { int *Polje1, *Polje2, Duljina;int *Polje1, *Polje2, Duljina;

// inicijalizacija// inicijalizacijaprintf ("Unesi broj clanova polja >");printf ("Unesi broj clanova polja >");scanf ("%d", &Duljina);scanf ("%d", &Duljina);Polje1 = (int *) malloc (Duljina * sizeof (int));Polje1 = (int *) malloc (Duljina * sizeof (int));Polje2 = (int *) malloc (Duljina * sizeof (int));Polje2 = (int *) malloc (Duljina * sizeof (int));if (!Polje1 || !Polje2) Fatalno ("Nema dovoljno memorije!");if (!Polje1 || !Polje2) Fatalno ("Nema dovoljno memorije!");// generiranje podataka// generiranje podataka

Generiraj (Polje2, Duljina);Generiraj (Polje2, Duljina); // sortiranje// sortiranje TestSorta (Polje1, Polje2, Duljina, "Selection Sort", SelectionSort);TestSorta (Polje1, Polje2, Duljina, "Selection Sort", SelectionSort); TestSorta (Polje1, Polje2, Duljina, "Bubble Sort", BubbleSort);TestSorta (Polje1, Polje2, Duljina, "Bubble Sort", BubbleSort); TestSorta (Polje1, Polje2, Duljina, "Bubble Sort poboljsani", TestSorta (Polje1, Polje2, Duljina, "Bubble Sort poboljsani",

BubbleSortPoboljsani);BubbleSortPoboljsani); TestSorta (Polje1, Polje2, Duljina, "Insertion Sort", InsertionSort);TestSorta (Polje1, Polje2, Duljina, "Insertion Sort", InsertionSort); TestSorta (Polje1, Polje2, Duljina, "Shell Sort", ShellSort);TestSorta (Polje1, Polje2, Duljina, "Shell Sort", ShellSort); TestSorta (Polje1, Polje2, Duljina, "Heap Sort", HeapSort);TestSorta (Polje1, Polje2, Duljina, "Heap Sort", HeapSort); TestSorta (Polje1, Polje2, Duljina, "Merge Sort", MergeSort);TestSorta (Polje1, Polje2, Duljina, "Merge Sort", MergeSort); TestSorta (Polje1, Polje2, Duljina, "Quick Sort", QuickSort);TestSorta (Polje1, Polje2, Duljina, "Quick Sort", QuickSort);

exit(0);exit(0);}}