Sortiranje

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 36

Algoritmi i strukture podataka

Prof. dr. sc. Damir Kalpić


Prof. dr. sc. Vedran Mornar
Prof. dr. sc. Krešimir Fertalj
Doc. dr. sc. Gordan Gledec
dr. sc. Zvonimir Vanjak
Doc. dr. sc. Ivica Botički
dr. sc. Boris Milašinović

07.04.2024 Zaštićeno licencom http://creativecommons.org/licenses/by-nc-sa/3.0/hr/


Creative Commons
 slobodno smijete:
 dijeliti — umnožavati, distribuirati i javnosti priopćavati djelo
 remiksirati — prerađivati djelo
 pod sljedećim uvjetima:
 imenovanje. Morate priznati i označiti autorstvo djela na način kako je specificirao
autor ili davatelj licence (ali ne način koji bi sugerirao da Vi ili Vaše korištenje
njegova djela imate njegovu izravnu podršku).
 nekomercijalno. Ovo djelo ne smijete koristiti u komercijalne svrhe.
 dijeli pod istim uvjetima. Ako ovo djelo izmijenite, preoblikujete ili stvarate koristeći
ga, preradu možete distribuirati samo pod licencom koja je ista ili slična ovoj.

U slučaju daljnjeg korištenja ili distribuiranja morate drugima jasno dati do znanja licencne uvjete ovog
djela. Najbolji način da to učinite je linkom na ovu internetsku stranicu.
Od svakog od gornjih uvjeta moguće je odstupiti, ako dobijete dopuštenje nositelja autorskog prava.
Ništa u ovoj licenci ne narušava ili ograničava autorova moralna prava.
Tekst licencije preuzet je s http://creativecommons.org/.

Algoritmi i strukture podataka, FER 07.04.2024 2 / 36


Postupci sortiranja

07.04.2024
3 / 36
Algoritmi

 odabrani postupci za ilustraciju:


 sortiranje biranjem (selection sort)
 bubble sort
 sortiranje umetanjem (insertion sort)
 Shellov sort
 mergesort
 quick sort
 sortiranje s pomoću gomile (heap sort) - kasnije!

 Sortovi
http://www.solidware.com/sort/
Algoritmi i strukture podataka, FER 07.04.2024 4 / 36
Sortiranje biranjem (selection sort)

 pronađi najmanji element niza i zamijeni ga s prvim elementom niza


 ponavljaj s ostatkom niza, smanjujući nesortirani dio

6 4 1 8 7 5 3 2
1 4 6 8 7 5 3 2
1 2 6 8 7 5 3 4
1 2 3 8 7 5 6 4
1 2 3 4 7 5 6 8
1 2 3 4 5 7 6 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8
Algoritmi i strukture podataka, FER 07.04.2024 5 / 36
Algoritam i složenost

 izvedba - 2 petlje:
 vanjska određuje granice sortiranog dijela niza
 unutarnja traži najmanji element u nizu
n 1
void SelectionSort (int A [], int N) {  O(n  i  1)
i 0
int i, j, min;
for (i = 0; i < N; i++) {
min = i;
for (j = i+1; j < N; j++) {
if (A[j] < A[min]) min = j;
O(n-i-1)
}
Zamijeni(&A[i], &A[min]);
}
}

Algoritmi i strukture podataka, FER 07.04.2024 6 / 36


Analiza vremena izvođenja

 dominira usporedba; zamjena ima manje


 vrijeme izvođenja ne ovisi o početnom redoslijedu, nego o broju
elemenata
 O(n2) - otprilike n2/2 usporedbi i n zamjena u prosječnom i u
najgorem slučaju
 nije bitno brži kad su ulazni elementi blizu svojih mjesta
 ubrzanje:
 sortirati odjednom s obje strane
 najgori slučaj: naopako sortiran niz

Algoritmi i strukture podataka, FER 07.04.2024 7 / 36


Bubble-sort

 ideja: zamjena susjednih elemenata ako nisu u dobrom redoslijedu


 kreni od početka niza prema kraju
 zamijeni 2 elementa ako je prvi veći od drugog
 ubrzanje: ako u prolasku kroz cijeli niz nije bilo zamjene, niz je sortiran

Algoritmi i strukture podataka, FER 07.04.2024 8 / 36


Primjer sortiranja bubble-sortom

1. prolaz 2. prolaz 3. prolaz 4. prolaz


64187532 41675328 14653278 14532678
46187532 14675328 14653278 14532678
41687532 14675328 14653278 14532678
41687532 14675328 14563278 14352678
41678532 14657328 14536278 14325678
41675832 14653728 14532678
41675382 14653278
41675328
5. prolaz 6. prolaz 7. prolaz
14325678 13245678 12345678
14325678 13245678 12345678
13425678 12345678
13245678

Algoritmi i strukture podataka, FER 07.04.2024 9 / 36


Algoritam

n2
void BubbleSort (int A [], int N) {
 O(n  i  1)
int i, j; i 0

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


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

Algoritmi i strukture podataka, FER 07.04.2024 10 / 36


Poboljšani bubble-sort

 ako u nekom prolazu nije bilo zamjene, niz je sortiran


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

Algoritmi i strukture podataka, FER 07.04.2024 11 / 36


Analiza vremena izvođenja

 O(n2) - otprilike n2/2 usporedbi i n2/2 zamjena u prosječnom i u


najgorem slučaju
 kad su ulazni elementi blizu svojih mjesta može se brzo završiti
 najgori slučaj: naopako sortiran niz
 najbolji slučaj: već sortiran niz
 položaj elemenata bitan za učinkovitost
 veliki elementi na početku niza nisu problem – brzo idu na kraj - zečevi
 mali elementi na kraju niza su probem – polako idu prema vrhu - kornjače

Algoritmi i strukture podataka, FER 07.04.2024 12 / 36


Sortiranje umetanjem (insertion sort)

 ideja: postoje dva dijela niza: sortirani i nesortirani


 u svakom koraku sortirani dio se proširuje tako da se u njega na ispravno
mjesto ubaci prvi element iz nesortiranog dijela niza
 tako se (obično) sortiraju karte u kartaškim igrama

<=x >x x nesortirano

<=x x >x nesortirano

Algoritmi i strukture podataka, FER 07.04.2024 13 / 36


Primjer sortiranja umetanjem

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

Algoritmi i strukture podataka, FER 07.04.2024 14 / 36


Algoritam i složenost

 izvedba - 2 petlje:
 vanjska služi za određivanje granice sortiranog dijela
 unutarnja ubacuje element u sortirani niz i pomiče ostale elemente

void InsertionSort (int A [], int N) {


n 1
int i, j; O( O(i ))
int pom; i 0

for (i = 1; i < N; i++) {


pom = A[i];
for (j = i; j >= 1 && A[j-1] > pom; j--)
A[j] = A[j-1]; O(i)
A[j] = pom;
}
}

Algoritmi i strukture podataka, FER 07.04.2024 15 / 36


Analiza vremena izvođenja

 O(n2) - otprilike n2/4 usporedbi i n2/4 zamjena u prosječnom i 2


puta više u najgorem slučaju
 kad su ulazni elementi blizu svojih mjesta, brzo završava
 sort je stabilan
 ne dolazi do zamjene relativnih pozicija elemenata koji imaju istu vrijednost
ključa
 ako a i b imaju isti ključ i a je bilo prije b, nakon stabilnog sorta a će i dalje
biti ispred b
 Koji su najbolji i najgori slučajevi?
 najgori slučaj: naopako sortiran niz
 najbolji slučaj: već sortiran niz

Algoritmi i strukture podataka, FER 07.04.2024 16 / 36


Shellov sort (Shell sort)

 najstariji brzi algoritam, modificirani sort umetanjem


 autor: Donald Shell
 ideja:
 za k-sortirano polje A vrijedi A[i]  A [i + k], i, i+k indeksi
 ako je polje k-sortirano i dodatno se t-sortira (t<k), ostaje i dalje k-sortirano
 potpuno sortirano polje je 1-sortirano
 općenito, koristi se inkrementalni slijed brojeva h1, h2, h3, … ,ht
 izbor sekvence izuzetno je bitan za učinkovitost algoritma
 animacija:
 http://www.cis.fiu.edu/~weiss/Shellsort.html

Algoritmi i strukture podataka, FER 07.04.2024 17 / 36


Shellov sort – primjer

korak = 4 korak = 2 korak = 1


64187532 14627538 12346578
64187532 12647538 12346578
64187532 12647538 12346578
64127538 12647538 12346578
12346578 12345678
12346578 12345678
12345678
Algoritmi i strukture podataka, FER 07.04.2024 18 / 36
Algoritam

void ShellSort (int A [], int N) {


int i, j, korak, pom;
for (korak = N / 2; korak > 0; korak /= 2) {
for (i = korak; i < N; i++) {
pom = A [i];
for (j = i; j >= korak && A[j-korak] >
pom; j -= korak) {
A [j] = A [j - korak];
}
A [j] = pom;
}
}
}

Algoritmi i strukture podataka, FER 07.04.2024 19 / 36


Analiza složenosti

 prosječno vrijeme izvođenja je već dugo otvoreni (neriješeni)


problem
 najgori slučaj O(n2)
 Hibbardov slijed: {1, 3, 7, …, 2k -1} rezultira najgorim slučajem
O(n3/2)
 prosječno O(n5/4) utvrđeno je simulacijom; nitko to nije uspio dokazati!
 Sedgwickov slijed: {1, 5, 19, 41, 109,…}, odnosno 9*4i - 9*2i + 1
alternira s 4i - 3*2i +1
 najgori slučaj O(n4/3) , a prosječno O(n7/6)
 ne zna se postoji li bolji slijed
 jednostavan algoritam, a krajnje složena analiza složenosti

Algoritmi i strukture podataka, FER 07.04.2024 20 / 36


Usporedba sortova sa složenošću O(n2)

Bubble

Selection

Insertion

Shell

Algoritmi i strukture podataka, FER 07.04.2024 21 / 36


Mergesort

 koristi se strategija "podijeli pa vladaj" uz rekurziju


 autor: John von Neumann, 1945. godine
 ideja algoritma:
 nesortirani niz podijeli se na dva niza podjednake veličine
 svaki podniz sortira se rekurzivno, dok se ne dobije niz od 1 elementa
– taj niz od jednog elementa je sortiran!
 spoje se dva sortirana podniza u sortirani niz
– na temelju dva sortirana polja (A i B) puni se treće (C)
 grananjem nastane log2 n razina, a u svakoj od razina obavlja se
O(n) posla
 trajanje je O(n log2 n)

Algoritmi i strukture podataka, FER 07.04.2024 22 / 36


Primjer sortiranja

31 24 47 1 6 78 12 65
31 24 47 1 6 78 12 65
31 24 47 1 6 78 12 65
31 24 47 1 6 78 12 65
24 31 1 47 6 78 12 65
1 24 31 47 6 12 65 78

1 6 12 24 31 47 65 78
Algoritmi i strukture podataka, FER 07.04.2024 23 / 36
Algoritam

 vježba: napišite funkciju Merge


 funkcija spaja lijevu i desnu sortiranu polovicu u sortirani niz

void MSort(int A [], int PomPolje[], int lijevo, int desno) {


int sredina;
if (lijevo < desno) {
sredina = lijevo + (desno - lijevo) / 2;
MSort (A, PomPolje, lijevo, sredina);
MSort (A, PomPolje, sredina + 1, desno);
Merge (A, PomPolje, lijevo, sredina + 1, desno);
}
}

Algoritmi i strukture podataka, FER 07.04.2024 24 / 36


Napomene

 cijena bržeg sortiranja: memorija


 stvara se pomoćno polje!
 rijetko se koristi za sortiranje u središnjoj memoriji
 povećani su zahtjevi za dodatnom memorijom i kopiranjem
 to je ključni algoritam za sortiranje na vanjskoj memoriji
 ponašanje u prosječnom i najgorem slučaju: O(nlog2n)
 ne radi ništa brže ako je ulazni niz već sortiran!

Algoritmi i strukture podataka, FER 07.04.2024 25 / 36


Quicksort

 do sada najbrži poznati algoritam za sortiranje


 rekurzija: "podijeli pa vladaj“
 http://euler.slu.edu/~goldwasser/demos/quicksort/
 http://www.cs.queensu.ca/home/cisc121/2004f/lecturenotes/malamb/SortingDemos/QuickSortDemo.html

 4 koraka – quicksort (S)


 ako je broj članova polja S jednak 0 ili 1, povratak u pozivni program
 odabrati bilo koji član v u polju S. To je stožer (pivot)
 podijeli preostale članove polja S, S \ {v} u dva odvojena skupa:
– S = { x  S \ {v}  x  v} (sve što je manje od stožera, preseli lijevo)
1
– S2 = { x  S \ {v}  x  v} (sve što je veće od stožera, preseli desno)
 vrati niz sastavljen od {quicksort (S1), v, quicksort (S2)}

Algoritmi i strukture podataka, FER 07.04.2024 26 / 36


Izbor stožera

 nije jednoznačno određen


 nije jednoznačno određeno niti što učiniti s članovima polja jednakim stožeru
 to postaje pitanje realizacije algoritma
 dio dobre izvedbe je učinkovito rješenje ovog pitanja
– Weiss: "Data Structures and Algorithm Analysis in C".
 moguće metode izbora stožera:
 procjena medijana temeljem 3 elementa (prvi element, zadnji element, element na polovici)
– pri procjeni medijana, ti se elementi odmah sortiraju
 druge mogućnosti: slučajni element, prvi element, zadnji element
 npr. niz: 8 1 4 9 6 3 5 2 7 0
– pivot = med3 (8, 6, 0) = 6
 koji je najgori mogući odabir stožera?
 što je stvarni medijan?

Algoritmi i strukture podataka, FER 07.04.2024 27 / 36


Primjer sortiranja quicksortom
izbor stožera i i j se mimoilaze
8 1 4 9 6 3 5 2 7 0 0 1 4 2 5 3 7 9 6 8
^ ^ ^ j i
0 1 4 9 6 3 5 2 7 8 0 1 4 2 5 3 7 9 6 8
stožer predzadnji
vraćamo stožer na i
0 1 4 9 7 3 5 2 6 8 0 1 4 2 5 3 7 9 6 8
i-> <-j
0 1 4 9 7 3 5 2 6 8 i
i j 0 1 4 2 5 3 6 9 7 8
0 1 4 2 7 3 5 9 6 8
i j izbor stožera izbor stožera
0 1 4 2 5 3 7 9 6 8 0 1 4 2 5 3 6 9 7 8

Algoritmi i strukture podataka, FER 07.04.2024 28 / 36


Složenost algoritma

 prosječno vrijeme izvođenja je O(n log n)


 sortiranje je vrlo brzo, uglavnom zbog visokooptimirane unutrašnje petlje
 najgori slučaj je O(n2)
 uz krivi odabir stožera (min ili max član), dobiva se n particija i za svaku je
vrijeme izvođenja O(n)
 može se postići da vjerojatnost da takav slučaj nastupi eksponencijalno
pada

Algoritmi i strukture podataka, FER 07.04.2024 29 / 36


Usporedba sortova sa složenošću O(nlogn)

Heap

Merge

Quick

Algoritmi i strukture podataka, FER 07.04.2024 30 / 36


Postupci sortiranja

 sortiranje oko milijun podataka nije u praksi rijetko


 ako jedno obavljanje programske petlje traje 1 s:
 klasični sort trajao bi reda veličine 106 s (odnosno više od 11 dana)
 quick sort traje reda veličine 20 s
 ne treba uvijek tražiti rješenje u kupnji bržih i skupljih računala!
 može se isplatiti investicija u razvoj i primjenu boljih algoritama

Algoritmi i strukture podataka, FER 07.04.2024 31 / 36


Indirektno sortiranje

 za sortiranje velikih struktura nema smisla obavljati mnogo zamjena


velikog broja podataka
 primjeri takvih struktura
– matični broj studenta, prezime, ime, adresa, upisani predmeti i ocjene
 ako se podaci sortiraju npr. po matičnom broju, tada se izdvoje u posebno
polje matični brojevi s pripadnim pokazivačima na ostale podatke
 sortira se (bilo kojim od postupaka) samo takvo izdvojeno polje

Algoritmi i strukture podataka, FER 07.04.2024 32 / 36


Usporedba

naziv najbolje prosječno najgore stabilan metoda


selection sort O(n2) O(n2) O(n2) ne biranje
insertion sort O(n) O(n2) O(n2) da umetanje
bubble sort O(n) - O(n2) da zamjena
shell sort - - O(n3/2) ne umetanje
merge sort O(nlogn) O(nlogn) O(nlogn) da spajanje
quick sort O(nlogn) O(nlogn) O(n2) ne podjela
heap sort O(nlogn) O(nlogn) O(nlogn) ne biranje

Algoritmi i strukture podataka, FER 07.04.2024 33 / 36


Animacije algoritama
 http://www.geocities.com/SiliconValley/Network/1854/Sort1.html
 http://www.solidware.com/sort/
 http://www.cs.hope.edu/~dershem/ccaa/animator/Animator.html
 http://cg.scs.carleton.ca/~morin/misc/sortalg/
 http://homepages.dcc.ufmg.br/~dorgival/applets/SortingPoints/SortingPoints.html
 http://www.cis.fiu.edu/~weiss/Shellsort.html
 http://www.educypedia.be/education/mathematicsjavasorting.htm

 Google...

Algoritmi i strukture podataka, FER 07.04.2024 34 / 36


Zadaci za vježbu

 Napisati program koji će u cjelobrojnom polju od n članova pronaći


k-ti najveći član polja.
a) Učitano polje sortirati po padajućim vrijednostima i ispisati član s indeksom
k-1.
b) Učitati k članova polja, sortirati ih po padajućim vrijednostima. Učitavati
preostale članove polja. Ako je pojedini član manji od onoga s indeksom k-
1, ignorirati ga, ako je veći umetnuti ga na pravo mjesto, a izbaciti član
polja koji bi sad imao indeks k.
c) Varirati postupke sortiranja te odrediti pripadna apriorna vremena i izmjeriti
aposteriorna vremena izvođenja.
 Odrediti apriorna vremena trajanja, a izmjeriti aposteriorna vremena.
Varirati postupak sortiranja.

Algoritmi i strukture podataka, FER 07.04.2024 35 / 36


Zadaci za vježbu

Napisati program koji će od dvije sortirane slijedne datoteke


napraviti treću sortiranu slijednu datoteku.
 UpariDatoteke

Algoritmi i strukture podataka, FER 07.04.2024 36 / 36

You might also like