Programiranje 2
Pretra�zivanje i sortiranje
Milena Vujo�sevi�c Jani�ci�c
Jelena Graovac
www.matf.bg.ac.rs/~milena
www.matf.bg.ac.rs/~jgraovac
Programiranje 2
Beograd, 22. mart, 2017.
Pretra�zivanjeSortiranjeLiteratura
Pregled
1 Pretra�zivanje
2 Sortiranje
3 Literatura
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Pregled
1 Pretra�zivanje
Linearna pretraga
Binarna pretraga
2 Sortiranje
3 Literatura
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Pretra�zivanje
Pod pretra�zivanjem za dati niz elemenata podrazumevamo
odredivanje indeksa elementa niza koji je jednak datoj
vrednosti ili ispunjava neko drugo zadato svojstvo (npr. najve�ci
je element niza).
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Linearno pretra�zivanje
Linearno (ili sekvencijalno) pretra�zivanje niza je pretra�zivanje
zasnovano na ispitivanju redom svih elemenata niza ili
ispitivanju redom elemenata niza sve dok se ne naide na
tra�zeni element (zadatu vrednost ili element koji ima neko
speci��cno svojstvo)
Linearno pretra�zivanje je vremenske linearne slo�zenosti po
du�zini niza koji se pretra�zuje.
Ukoliko se u nizu od n elemenata tra�zi element koji je jednak
zadatoj vrednosti, u prose�cnom slu�caju (ako su elementi niza
slu�cajno rasporedeni), ispituje se n/2, u najboljem 1, a u
najgorem n elemenata niza.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
Linearna pretraga mo�ze biti realizovana rekurzivno. Naredna
funkcija vra�ca indeks prvog pojavljivanja zadatog celog broja x u
zadatom nizu a du�zine n ili vrednost -1, ako se x ne pojavljuje u a:
int linearna_pretraga(int a[], int n, int x) {
if (n==0)
return -1;
if (a[0] == x)
return 0;
int pozicija=linearna_pretraga(a+1, n-1, x);
return ((pozicija==-1) ? -1 : pozicija+1 );
}
Ova implementacija koristi pokaziva�cku aritmetiku i nije repno
rekurzivna.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
Dodavanjem parametra koji pamti poziciju, funkcija postaje repno
rekurzivna i ne koristi pokazia�cku aritmetiku:
int linearna_pretraga(int a[], int i, int n, int x) {
if (i == n)
return -1;
if (a[i] == x)
return i;
return linearna_pretraga(a, i+1, n, x);
}
Ova implementacija se mo�ze jednostavno transformisati u
iterativnu.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
Iterativna varijanta linearne pretrage prve pojave zadatog celog
broja x u zadatom nizu a du�zine n:
int linearna_pretraga(int a[], int n, int x) {
int i;
for (i = 0; i < n; i++)
if (a[i] == x)
return i;
return -1;
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
�Cesta gre�ska prilikom implementacije linearne pretrage je prerano
vra�canje negativne vrednosti:
int linearna_pretraga(int a[], int n, int x) {
int i;
for (i = 0; i < n; i++)
if (a[i] == x)
return i;
else
return -1;
}
Navedena naredba return prouzrokuje prekid rada funkcije tako da
implementacija mo�ze da prekine petlju ve�c nakon prve iteracije.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
Ukoliko tra�zimo poslednje pojavljivanje elementa u nizu, onda je
rekurzivna implementacija linerane pretrage jednostavinija:
int linearna_pretraga(int a[], int n, int x) {
if (n == 0)
return -1;
else if (a[n - 1] == x)
return n-1;
else return linearna_pretraga(a, n-1, x);
}
Ova implementacija se mo�ze jednostavno transformisati u
iterativnu.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Primer
U iterativnoj varijanti linearne pretrage pri �cemu se tra�zi poslednje
pojavljivanje elementa u nizu, pretragu po�cinjemo od kraja niza:
int linearna_pretraga(int a[], int n, int x) {
int i;
for (i = n-1; i >=0; i--)
if (a[i] == x)
return i;
return -1;
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Binarna pretraga
Binarno pretra�zivanje je pronala�zenje zadate vrednosti u
zadatom skupu objekata, pri �cemu se pretpostavlja da su
objekti zadatog skupa sortirani, i u svakom koraku, sve dok se
ne pronade tra�zena vrednost, taj skup se deli na dva dela i
pretraga se nastavlja samo u jednom delu � odbacuje se deo
koji sigurno ne sadr�zi tra�zenu vrednost.
Binarno pretra�zivanje ne mo�zemo da primenimo ukoliko skup
objekata koji pretra�zujemo nije sortiran.
Primer: pogadanje brojeva sa poznatom gornjom granicom
Primer: pogadanje brojeva ukoliko gornja granica nije poznata
Slo�zenost O(log n)
Razlog za�sto su re�cnici, enciklopedije, telefonski imenici
sortirani (varijanta pretra�zivanja koja se naziva interpolaciona
pretraga)
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Binarna pretraga
Implementacija binarne pretrage niza
int binarna_pretraga(int a[], int n, int x) {
if (n==0)
return -1;
if (a[n/2] == x)
return n/2;
if(x<a[n/2]) return binarna_pretraga(a, n/2,x);
else {
int pozicija = binarna_pretraga(a+n/2+1, n/2,x);
return (pozicija == -1 ? -1: n/2+1+pozicija);
}
}
Prethodna funkcija koristi pokaziva�cku aritmetiku i nije repno
rekurzivna, pa je ne mo�zemo jednostavno prevesti u iterativnu
funkciju.Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Binarna pretraga
Implementacija binarne pretrage niza repnom rekurzijom: uvodenjeparametara leve i desne granice
int binarna_pretraga(int a[], int l, int d, int x) {
int s;
if (l > d)
return -1;
s = l + (d - l)/2; /*Ovo nije ekvivalentno sa (l+d)/2!*/
if (x == a[s])
return s;
if (x < a[s])
return binarna_pretraga(a, l, s-1, x);
else /*if (x > a[s])*/
return binarna_pretraga(a, s+1, d, x);
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Binarna pretraga
Iterativno re�senje:
int binarna_pretraga(int a[], int n, int x) {
int l, d, s;
l = 0; d = n-1;
while(l <= d) {
s = l + (d - l)/2;
if (x == a[s])
return s;
if (x > a[s])
l = s + 1;
else /*if (x < a[s])*/
d = s - 1;
}
return -1;
}Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Linearna pretragaBinarna pretraga
Binarna pretraga
Da bi se smanjio broj poredenja, proveru na jednakost treba ostaviti
za kraj:
int binarna_pretraga(int a[], int n, int x) {
int l, d, s;
l = 0; d = n-1;
while(l <= d) {
s = l + (d - l)/2;
if (x > a[s])
l = s + 1;
else if (x < a[s])
d = s - 1;
else /* if (x == a[s]) */
return s;
}
return -1;
} Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Pregled
1 Pretra�zivanje
2 Sortiranje
Selection sort
Merge sort
Quick sort
3 Literatura
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Sortiranje
Sortiranje je jedan od fundamentalnih zadataka u ra�cunarstvu.
Sortiranje podrazumeva uredivanje niza u odnosu na neko
linearno uredenje.
Primeri:
uredenje niza brojeva po veli�cini � rastu�ce ili opadaju�ce,
uredivanje niza niski leksikografski ili po du�zini,
uredivanje niza struktura na osnovu vrednosti nekog polja.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Sortiranje
Postoji vi�se razli�citih algoritama za sortiranje nizova.
Neki algoritmi su jednostavni i intuitivni, dok su neki
kompleksniji, ali izuzetno e�kasni.
Naj�ce�s�ce kori�s�ceni algoritmi za sortiranje su:
Bubble sort
Selection sort
Insertion sort
Shell sort
Merge sort
Quick sort
Heap sort
http://www.sorting-algorithms.com/
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Sortiranje
Algoritmi sortiranja imaju razli�cite vremenske i prostorne
slo�zenosti.
Neki od algoritama za sortiranje rade u mestu (engl. in-place),
tj. sortiraju zadate elemente bez kori�s�cenja dodatnog niza.
Drugi algoritmi zahtevaju kori�s�cenje pomo�cnog niza ili nekih
drugih struktura podataka.
Prilikom izra�cunavanja vremenske slo�zenosti algoritama
sortiranja obi�cno se uzimaju u obzir samo operacije poredenja i
operacije zamene, jer su one za podatke netrivijalnih tipova
najskuplje operacije.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Sortiranje � klase slo�zenosti
Jednostavniji, sporiji algoritmi sortiranja imaju slo�zenost
najgoreg slu�caja O(n2) i u tu grupu spadaju bubble, insertion i
selection.
Shell sort je algoritam kojem, u zavisnosti od implementacije,
slo�zenost varira od O(n2) do O(n log2 n).
Kompleksniji, br�zi algoritmi imaju slo�zenost najgoreg slu�caja
O(n log n) i u tu grupu spadaju heap i merge sort (ovi
algoritmi zahtevaju dodatni memorijski prostor).
Algoritam quick sort ima slo�zenost najgoreg slu�caja O(n2), ali,po�sto je slo�zenost prose�cnog slu�caja O(n log n) i po�sto u praksi
pokazuje dobre rezultate, ovaj se algoritam ubraja u grupu
veoma brzih algoritama.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Selection sort
Primer animacije
Ideja: prona�ci najmanji element u nizu i postaviti ga na nulto
mesto, zatim prona�ci najmanji od ostatka niza i dovesti ga na
prvo mesto, i tako redom, do kraja niza.
Pozicija minimalnog elementa u nizu po�cev�si od pozicije i:
int poz_min(int a[], int n, int i) {
int m = i, j;
for (j = i + 1; j < n; j++)
if (a[j] < a[m])
m = j;
return m;
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Selection sort
void razmeni(int a[], int i, int j) {
int tmp = a[i]; a[i] = a[j]; a[j] = tmp;
}
int selectionsort(int a[], int n) {
int i;
for (i = 0; i < n - 1; i++)
razmeni(a, i, poz_min(a, n, i));
}
Vremenska slo�zenost je kvadratna, dok je prostorna slo�zenost
konstantna (sortiranje u mestu).
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Selection sort
Selection sort se mo�ze implementirati rekurzivno. Ne�sto
jednostavnija implementacija je ukoliko se umesto dovodenjanajmanjeg na po�cetak niza, uradi dovodenje najve�ceg na kraj niza.
Naravno, pozicija maksimalnog elementa u nizu takode mo�ze da se
implementira rekurzivno (ali i ne mora)
int poz_max(int a[], int n) {
if (n == 1)
return 0;
else {
int m = poz_max(a, n-1);
return a[m] > a[n-1] ? m : n-1;
}
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Selection sort
Rekurzivna implementacija:
void selectionsort(int a[], int n) {
if (n > 1) {
razmeni(a, n-1, poz_max(a, n));
selectionsort(a, n-1);
}
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Merge sort
Dva ve�c sortirana niza se mogu objediniti u tre�ci sortirani niz samo
jednim prolaskom kroz nizove (tj. u linearno vremenu O(m+ n) gdesu m i n dimenzije polaznih nizova).
void merge(int a[], int m, int b[], int n, int c[]) {
int i, j, k;
i = 0, j = 0, k = 0;
while (i < m && j < n)
c[k++] = a[i] < b[j] ? a[i++] : b[j++];
while(i < m) c[k++] = a[i++];
while(j < n) c[k++] = b[j++];
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Merge sort
Merge sort algoritam deli niz na dve polovine (�cija se du�zina
razlikuje najvi�se za 1), rekurzivno sortira svaku od njih, i zatim
objedinjuje sortirane polovine. Izlaz iz rekurzije je jedini�cni niz.
void mergesort_(int a[], int l, int d, int tmp[]) {
if (l < d) {
int i, j;
int n = d - l + 1, s = l + n/2;
int n1 = n/2, n2 = n - n/2;
mergesort_(a, l, s-1, tmp);
mergesort_(a, s, d, tmp);
merge(a + l, n1, a + s, n2, tmp);
for (i = l, j = 0; i <= d; i++, j++)
a[i] = tmp[j];
}
}Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Merge sort
Vremenska slo�zenost � O(nlogn)
Prostorna slo�zenost � O(n)
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Quick sort
Osnovna ideja je da se izabere jedan element, tzv pivot i da se
on postavi na svoje mesto u nizu i to tako da su svi elementi
levo od njega manji od njega, a svi desno od njega ve�ci od
njega (korak particionisanja).
Zatim se postupak rekurzivno ponovi za levi i desni podniz.
Primer animacije.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Quick sort
void qsort_(int a[], int l, int d) {
if (l < d) {
/*dovedi pivot na poziciju l*/
razmeni(a, l, izbor_pivota(a, l, d));
/*postavi pivot tako da su levo manji od njega,
a desno veci*/
int p = particionisanje(a, l, d);
/*Sortiraj rekurzivno levi i desni podniz*/
qsort_(a, l, p - 1);
qsort_(a, p + 1, d);
}
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Slo�zenost
Kako bi se dobila jedna�cina T (n) = 2T (n/2) + O(n) ie�kasnost O(n log n), potrebno je da korak particionisanja
(tj. funkcija particionisanje) bude izvr�sen u linearnom
vremenu O(n).
Particionisanje mo�ze da se implementira da bude linearno, ali
je pravi izbor pivota problem jer nam treba takav da nam
podeli niz na dva dela jednakih veli�cina, a to ne mo�ze u
konstantnom vremenu.
Zbog toga je u najgorem slu�caju kvadratna slo�zenost.
U prose�cnom slu�caju mo�ze o�cekivati relativno ravnomerna
raspodela �sto dovodi do optimalne slo�zenosti (O(n log n)).
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Quick sort
Izbor pivota mo�ze da bude razli�cit, najjednostavnije je da se
izabere sam levi element. Bolje performanse: npr. za pivot
uzme srednji od tri slu�cajno izabrana elementa niza.
Particionisanje se takode mo�ze uraditi na razli�cite na�cine.
int particionisanje(int a[], int l, int d) {
int p = l, j; /*Pivot je krajnji levi element*/
for (j = l+1; j <= d; j++)
if (a[j] < a[l]) /*if(a[j] < pivot)*/
razmeni(a, ++p, j); /*element koji je manji od pivota
dovodimo na pocetak niza*/
razmeni(a, l, p); /*dovodimo pivot na njegovu
poziciju*/
return p; /*vracamo poziciju pivota*/
}
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Selection sortMerge sortQuick sort
Quick sort
Napomenimo da je quick sort algoritam koji u praksi daje
najbolje rezultate kod sortiranja duga�ckih nizova.
Medutim, va�zno je napomenuti da kod sortiranje kra�cih nizova
naivni algoritmi (npr. insertion sort) mogu da se poka�zu
prakti�cnijim.
Ve�cina realnih implementacija quick sort algoritma koristi
hibridni pristup � izlaz iz rekurzije se vr�si kod nizova koji
imaju nekoliko desetina elemenata i na njih se primenjuje
insertion sort.
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Pretra�zivanjeSortiranjeLiteratura
Pregled
1 Pretra�zivanje
2 Sortiranje
3 Literatura
Milena Vujo�sevi�c Jani�ci�c Jelena Graovac Programiranje 2
Top Related