You are on page 1of 38

STRUKTURE

PODATAKA I ALGORITMI

sor)ranje

Strukture podataka i algoritmi

2011/2012

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Sor)ranje je postupak ponovnog rasporeivanja stvari prema nekoj njihovoj
odrednici, na nain da te stvari budu rasporeene uzlazno ili silazno.

Neke od najvanijih primjena sor)ranja


- rjeenje problema zajednitva kod kojeg su svi elemen) s is)m opisom doneseni
odjednom
ako je dano 10 5sua elemenata u proizvoljnom poretku, pri emu mnogi od njih imaju istu
vrijednost, a potrebno je presloi5 te elemente tako da svi elemen5 s jednakim vrijednos5ma
budu jedan pored drugoga

- usporeivanje elemenata u jednoj ili vie datoteka


ako je nekoliko datoteka sor5rano na is5 nain (npr. uzlazno) mogue je pronai sve podatke
koji se poklapaju u samo jednom sekvencijalnom prolazu kroz njih, bez kretanja u suprotnom
smjeru

- potraga za informacijom prema vrijednos: kljua


telefonski imenik

Strukture podataka i algoritmi

2 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Jedna od prvih primjena sor)ranja u velikim informacijskim sustavima je bila
1960. u tvrtci Computer Sciences Corpora)on
U tom desetljeu proizvoai raunala su tvrdili kako vie od 25% vremena u
kojem njihova raunala rade, otpada na sor)ranje, a u nekim tvrtkama taj
postotak je rastao i do 50%.
Odavde su se kristalizirala 3 zakljuka
- sor)ranje ima mnogo vanih primjena
- ljudi sor)raju kada i ne bi trebali
- u upotrebi su neuinkovi) algoritmi sor)ranja

Na prvi i drugi zakljuak raunarstvo nije moglo utjeca), ali na trei itekako je,
razvojem novih i uinkovi)jih algoritama sor)ranja

Strukture podataka i algoritmi

3 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Za bolje shvaanje sor)ranja potrebno je poblie denira) problem kojeg ono
ima rijei)
Dano je n elemenata R
1 , R
2 ,,
R n koje treba sor)ra), pri emu se elemen)
esto zovu zapisi (eng. record)
Svakom od zapisa R j pripada odgovarajui klju K
j koji usmjerava proces
sor)ranja.
- Kljuevi predstavljaju neku odrednicu zapisa po kojoj se sor)ra. Ako zapis predstavlja
studenta s imenom, prezimenom, godinom roenja i sl. onda jedan od kljueva moe bi)
dob ili prezime

Strukture podataka i algoritmi

4 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Zapise sor)ranjem valja poreda) na specian nain, a ta relacija poretka
(ureaja) koja se denira nad kljuevima mora zadovoljava) sljedee uvjete za
bilo koja tri kljua a,b, c
- naelo trihotomije - uvijek vrijedi tono jedan od izraza a < b, a = b, a > b
- tranzi:vnost - iz odnosa a <
b i b < c lslijedi odnos a < c

Cilj sor)ranja je pronai permutaciju p ( 1 ) p ( 2 )


p ( n ) nad indeksima { 1,
2,,
n}
koja e postavi) kljueve u nepadajui poredak

K p (1) K p ( 2 ) K p ( n )
Sor)ranje se dodatno naziva stabilnim ako zapisi sa is)m kljuevima nakon
sor)ranja zadre svoj is) rela)vni poredak u odnosu na poetno stanje

Strukture podataka i algoritmi

5 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Neka je dano pet uzastopnih memorijskih lokacija M1, M2, M3, M4, M5 a na
svakoj od njih po jedan cijeli broj. Napii program koji e izmijeniC poredak
brojeva na lokacijama, ako je to potrebno, tako da budu poredani uzlazno.

Za vjebu, pokuajte ovo rijei: na neki va nain! Moe i na papiru.

Strukture podataka i algoritmi

6 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE
Neka je dano pet uzastopnih memorijskih lokacija M1, M2, M3, M4, M5 a na
svakoj od njih po jedan cijeli broj. Napii program koji e izmijeniC poredak
brojeva na lokacijama, ako je to potrebno, tako da budu poredani uzlazno.
Ako ste napravili takav algoritam on gotovo sigurno spada u jedan od sljedeih
)pova:
- sor)ranje umetanjem
brojevi se razmatraju jedan po jedan i svaki novorazmatrani broj se umee na odgovarajuu
poziciju ovisno o prethodno sor5ranim elemen5ma

- sor)ranje izmjenom
ako se za dva susjedna broja utvrdi da nisu u povoljnom meusobnom odnosu tada oni
mijenjaju mjesta, a ovaj postupak se ponavlja sve dok zamjene vie nisu potrebne

- sor)ranje izborom
prvo se pronae najmanji (najvei) element i na neki nain izdvoji od ostatka, a potom se
proces ponavlja za preostale elemente

- sor)ranje spajanjem
- neto totalno drugaije
Strukture podataka i algoritmi

7 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM
Algoritmi iz ove skupine podsjeaju na algoritme koritene pri slaganju karata u
kartakim igrama treeC ili remiju.
Prije razmatranja zapisa R j
- pretpostavljamo da su prethodni zapisi R
1 , R
2 ,,
R j 1 sor)rani
- potom ga umeemo na odgovarajue mjesto meu prethodno sor)rane zapise

Postoje zanimljive varijacije na ovu temu


- inser)on sort
- shell sort

Strukture podataka i algoritmi

8 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - INSERTION SORT


Algoritam
I1 [Vr: se u petlji po j] Obavljaj korake I2 do I5 za j = 2,
3,,
n a potom zavri algoritam
I2 [Postavi i, K, R] Postavi i = j 1, K = K j , R = R j
I3 [Usporedi K sa Ki] Ako je K K
i idi na I5
I4 [Pomakni Ri, smanji i] Postavi R i +1
= R
i ,i
= i 1 a
ako je i > 0 idi na I3

u sljedeim koracima pokuat


emo smjes55 R na pravo mjesto,
usporeujui K s Ki za sve padajue
vrijednos5 od i
Pronaeno mjesto za R

I5 [Smjes: R] Postavi Ri +1 = R
Ako je i = 0, tada je K najmanji
do sada pronaeni klju, tako
da zapis R pripada na mjestu 1

Strukture podataka i algoritmi

9 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - INSERTION SORT

Strukture podataka i algoritmi

10 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - INSERTION SORT

Strukture podataka i algoritmi

11 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - INSERTION SORT


Ovaj program se izvrava 9B + 10N -3A -9 vremenskih jedinica pri emu je
- N = broj zapisa koje treba sor)ra)
- A = koliko puta se i smanjuje do 0 u koraku S4
- B = broj micanja elemenata

Vremenska sloenost ovog algoritma je O


( n 2 ) za najgori sluaj

Strukture podataka i algoritmi

12 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - INSERTION SORT


static void Insertion(int[] niz)
{
int i;
for (i = 0; i < niz.Count(); i++)
{
/* Umetnimo niz[i] u sortirani podniz */
int j, v = niz[i];
for (j = i - 1; j >= 0; j--)
{
if (niz[j] <= v) break;
niz[j + 1] = niz[j];
}
niz[j + 1] = v;
}
}

Strukture podataka i algoritmi

13 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT


Ako je dan algoritam sor)ranja koji pomie elemente samo jednu po jednu
poziciju tada e njegov prosjeno vrijeme izvoenja u najbolju ruku bi) O ( n 2 )
Za unaprijeenje su potrebni odreeni mehanizmi koji pomiu elemente koji su
meusobno udaljeni za puno vie od jedne pozicije.
U srpnju 1959. Donald L. Shell je objavio rad u kojem je izloio jedan takav
mehanizam, a taj algoritam njemu u ast nosi algoritam Shellov sort.
Ideja algoritma je jednostavna:
- promatra) svako k-) element u nizu
- tako nastale k podnizove sor)ra) inser)on sort algoritmom
- smanji) k i ponovi) postupak
- kada je k = 1, cijeli niz sor)ra) inser)on sort algoritmom

Strukture podataka i algoritmi

14 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT


Algoritam

t je korak

S1 [Vr: se u petlji po s] Obavi korak S2 za s = t 1,t


2,,
0 a onda zavri algoritam
S2 [Vr: se u petlji po j] Postavi h=h
s i obavljaj korake S3 do S6 za h < j < n
S3 [Postavi i, K, R] Postavi i = j h, K = K j , R = R j
S4 [Usporedi K sa Ki] Ako je K

K
i idi na S6
S5 [Pomakni Ri, smanji i] Postavi R i + h = R
i ,i = i h a ako je i > 0 idi natrag na S4.
S6 [Smjes: R] Postavi Ri + h = R

Strukture podataka i algoritmi

15 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT

Strukture podataka i algoritmi

16 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT


Oito je da e za izvrenje algoritma treba) manje ili vie vremena ovisno o
odabiru koraka k kojima se stvaraju podnizovi.

( )

Najgori sluaj se ne moe spus)) ispod O n

Iscrpna istraivanja ovog problema su pokazala da je trenutno najbolji niz


koraka onaj kojeg denira poljski matema)ar Marcin Ciura

{1, 4,10, 23, 57,132, 301, 701,...}


Ukoliko je potrebno povea) korak, svaki sljedei je za otprilike 2.3 puta vei od
prethodnog.

Strukture podataka i algoritmi

17 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

static void ShellSortPomocna(int[] niz, int duljina, int korak)


{
int i;

!
!
!
!
!
!
!
!
!
!

for (i=0; i < duljina; i++)


{
/* Umetnimo niz[i] u sortirani podniz */
int j, v = niz[i];
for (j = i - korak; j >= 0; j -= korak)
{
if (niz[j] <= v) break;
niz[j + korak] = niz[j];
}

!
!

niz[j + korak] = v;
}
}

Strukture podataka i algoritmi

18 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - SHELLOV SORT


!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

static void ShellSort(int[] niz, int duljina)


{
int[] CiurinNiz = new int[8] {701, 301, 132, 57, 23, 10, 4, 1};
double prosirenje = 2.3;

!
!
!
!
!

!
!

!
!
!
!
!

!
!

!
!
!
!
!
!
!

!
!

int korak_idx = 0;
int korak = CiurinNiz[0];
if (duljina > korak)
{
while(duljina > korak)
{
korak_idx--;
korak = (int)(korak*prosirenje);
}
}
else
{
while(duljina < korak)
{
korak_idx++;
korak = CiurinNiz[korak_idx];
}
}
while (korak > 1)
{
korak_idx++;
if (korak_idx >= 0)
korak = CiurinNiz[korak_idx];
else
korak = (int)(korak/prosirenje);
ShellSortPomocna(niz, duljina, korak);
}

Strukture podataka i algoritmi

19 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM
Druga familija algoritama za sor)ranje koris) zamjenu ili transpoziciju kao
metodu sor)ranja, pri emu sistema)no zamjenjuje svaka dva elementa koja
nisu u eljenom odnosu, sve dok takvih parova vie nema.
Budui da se u svakom algoritmu sor)ranja odvija barem neka zamjena,
nezahvalno je jedan algoritam strpa) u jednu familiju a drugi u drugu, ali razlike
ipak postoje.
Varijacije na temu su
- bubble sort
- quicksort

Strukture podataka i algoritmi

20 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM - BUBBLE SORT


Vjerojatno najoi)ji nain sor)ranja izmjenom je usporeiva) kljueve K1 i K2 te
onda zamijeni) zapise R1 i R2 ako nisu u dobrom odnosu, a postupak nastavi) s
parovima R2 i R3, R3 i R4 itd
Metoda se zove bubble sort budui da najvei elemen) (ako sor)ramo uzlazno)
odmah isplivaju na povrinu poput mjehuria zraka u vodi.
U najboljem sluaju e se bubble sort izvri) samo jedan prolaz kroz sve
elemente, dok je naelno potrebno vie prolaza.

( )

Vremenska sloenost u najgorem sluaju je O n 2

Strukture podataka i algoritmi

21 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM - BUBBLE SORT

Strukture podataka i algoritmi

22 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - BUBBLE SORT


Algoritam

GRANICA je najvii indeks za koji se ne zna je li zapis


na svom konanom mjestu. prak5ki naznaavamo
kako u ovom trenutku nita ne znamo.

B1 [Postavi GRANICU] GRANICA = n

B2 [Vr: se u petlji po j] Postavi t=


0 . Obavi korak B3 za j = 1,
2,,GRANICA
1 i za)m idi
na korak B4
B3 [Usporedi/Zamijeni Rj i Rj+1] Ako je K
j
K
j +1
zamijeni R
j
R
j +1 te postavi t= j
B4 [Je li bilo zamjena?] Ako je t=0
zavri algoritam. U pro)vnom GRANICA = t i vra) se na B2

Strukture podataka i algoritmi

23 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - UMETANJEM - BUBBLE SORT

static void Bubble(int[] niz)


{
int i, j, t = 0;

!
!
!

!
!
!
!
!
!

!
!
!
!
!
!

for (i = 0; i < niz.Count() - 1; i++)


{
for (j = i + 1; j < niz.Count(); j++)
!
!
if (niz[i] < niz[j])
!
!
{
!
!
!
Zamjena(ref niz[i], ref niz[j]);
!
!
!
t++;
! }
if (t == 0) break;
}

Strukture podataka i algoritmi

24 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM - QUICK SORT


Unaprijeenje bubble sorta je algoritam Quicksort kojeg je izumio C.A.R. Hoare
1962.
Algoritam se temelji na proceduri sor)ranja koja bi se mogla nazva) par:cijska
zamjena budui da koristei rekurziju par)cionira niz na dva podniza prethodno
napravivi odgovarajue zamjene.
Odabere se neki element koji se proglasi pivotom.
- prvi, zadnji, srednji...

Potom se provjeravaju svi preostali elemen) tog niza i ako su manji od njega a
desno ili vei od njega a lijevo, mijenjaju mjesta s pivotom.
Algoritam je izrazito brz, ali i sloen za analizu.

( )

Vremenska sloenost quicksort algoritma u najgorem sluaju je O


n 2 ali
brzina algoritma se strahovito ubrzava u preostalim sluajevima gdje mu je
sloenost reda O ( n ln n )
Strukture podataka i algoritmi

25 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM - QUICK SORT

static void QuickSort ( int[] niz, int n )


{
QuickPomocna ( niz, 0, n - 1 );
}

static void QuickPomocna ( int[] niz, int prvi, int zadnji )


{
if ( prvi < zadnji )
{
int pivot = Particija ( niz, prvi, zadnji );
QuickPomocna ( niz, prvi, pivot - 1 );
QuickPomocna ( niz, pivot + 1, zadnji );
}
}

Strukture podataka i algoritmi

26 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZMJENOM - QUICK SORT

static int Particija ( int[] niz, int prvi, int zadnji )


{
int pivot = prvi;
while ( prvi < zadnji ) {
if ( niz[prvi] <= niz[zadnji] )
Zamjena (ref niz[pivot++], ref niz[prvi] );
++prvi;
}
Zamjena (ref niz[pivot], ref niz[zadnji] );
return pivot;
}

Strukture podataka i algoritmi

27 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZBOROM - SELECTION SORT


Trea familija algoritama sor)ranja bazirana je na ideji opetovanog izbora
Klasini predstavnik ove familije je Selec)on sort iji algoritam izgleda ovako
- pronai najmanji (najvei) klju
prenesi zapis s 5m kljuem na privremenu lokaciju
zamijeni taj klju vrijednou veom (manjom) od maks broja elemenata (0)

- ponovi prethodni korak


poto je prethodni najmanji (najvei) klju sada postao vei (manji) od najveeg (najmanjeg)
vie nije u igri

- nastavi ponavlja) korak 1 dok svih n zapisa nije odabrano

Strukture podataka i algoritmi

28 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZBOROM - SELECTION SORT

( )

Vremenska sloenost za selec)on sort u najgorem sluaju je O n 2

Boldane vrijednos) su kandida) za maksimum, ali ipak je samo jedan


Strukture podataka i algoritmi

29 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - IZBOROM - SELECTION SORT

static void Selection(int[] niz)


{
int i, j, mmax;
for (i = 0; i < niz.Count(); i++)
{
mmax = i;
for (j = i; j < niz.Count(); j++)
if (niz[mmax] > niz[j])
mmax = j;
Zamjena(ref niz[i], ref niz[mmax]);
}
}

Strukture podataka i algoritmi

30 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - SPAJANJEM - MERGE SORT


Spajanje podrazumijeva kombiniranje 2 ili vie nizova u jedan ureeni niz.
Primjerice spajanje nizova 503 703 765 i 087 512 677 u ureeni niz
087 503 512 677 703 765
Najjednostavniji nain za ovo je usporeiva) dva najmanja elementa iz )h
nizova te kao rezultat izbaci) manji od njih dva

Strukture podataka i algoritmi

31 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - SPAJANJEM - MERGE SORT


Merge sort koris) ovaj princip, no takoer koris) i princip podijeli pa vladaj.
Polazni niz se rekurzivno komada na dva niza po pola, sve dok duljina nastalog
niza nije 1.
Nakon toga, spajanjem se formiraju novi podnizovi ali sada sor)rani.
Vremenska sloenost u najgorem sluaju za merge sort je O ( n ln n )
Merge sort je prilino brz algoritam, ali mu je najvei nedostatak to to stalno
stvara nove podnizove i na taj nain zauzima puno memorije.

Strukture podataka i algoritmi

32 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - SPAJANJEM - MERGE SORT

Strukture podataka i algoritmi

33 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - SPAJANJEM - MERGE SORT


static void merge ( int[] niz, int first, int mid, int last )
{
int i = first, j = mid, k = 0;
int[] save = new int[last-first];

!
!

!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!

!
!
!
!

!
!

while ( i < mid && j < last )


{
if ( niz[i] <= niz[j] )
save[k++] = niz[i++];
else
save[k++] = niz[j++];
}

while ( i < mid )


save[k++] = niz[i++];

while ( j < last )


save[k++] = niz[j++];
for ( i = 0; i < ( last - first ); i++ )
niz[first + i] = save[i];
}

!
}

Strukture podataka i algoritmi

34 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - SPAJANJEM - MERGE SORT

!
!
!
!

!
!
!
!

static void merge_sort ( int[] niz, int first, int last )


{
if ( first < last - 1 ) {
int mid = ( first + last ) / 2;
merge_sort ( niz, first, mid );
merge_sort ( niz, mid, last );
merge ( niz, first, mid, last );
}
}

Strukture podataka i algoritmi

35 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - TOTALNO DRUGAIJE - RADIX SORT


Ovaj algoritam je drugaiji od drugih zato to ne usporeuje elemente ve
njihove znamenke
Poinje s usporedbom jedinica, pa dese)ca, pa )suica, ...
Kako je potrebno obavi) sve prolaze (ovisno o broju znamenaka najveeg broja)
to se u meustanjima pojavljuju nelogini poreci koji se na kraju ipak srede
Vremenska sloenost u najgorem sluaju za radix sort je O
( kn
) gdje je k broj
znamenaka najveeg broja

Strukture podataka i algoritmi

36 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - TOTALNO DRUGAIJE - RADIX SORT

radix
odredi koliko znamenaka ima max broj = k
petlja po i od 1 do k
formiraj niz znamenaka poevi s jedinicama (1) pa s deseticama (2) do k
sortiraj taj niz znamenaka
petlja po j od 0 do n-1 po nizu brojeva
etaj paralelno po nizu znamenaka i nizu brojeva
trai broj sa odgovarajuom znamenkom i zamijeni ga s trenutnom (1, 2, 3...)

Strukture podataka i algoritmi

37 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

SORTIRANJE - RADIX SORT


Poetak

1. prolaz

2. prolaz

3. prolaz

Kraj

503
087
512
061
908
170
897
275
653
426
154
509
612
677
765
703

170
061
512
612
503
653
703
154
275
765
426
087
897
677
908
509

503
908
509
703
512
612
426
653
154
061
765
170
275
677
087
897

061
087
154
170
275
426
503
509
512
612
653
677
703
765
897
908

061
087
154
170
275
426
503
509
512
612
653
677
703
765
897
908

Strukture podataka i algoritmi

38 / 38

Ivan Bilobrk - Odjel za Informa5ku - PMFST

You might also like