Professional Documents
Culture Documents
Podela na:
1. linearne(nizovi, liste)
2. nelinearne(stabla, grafovi, mreze)
Dve vrste:
1. Vremenska
2. Prostorna(memorijska)
Nas interesuje samo vremenska posto je memorija resurs kojeg u danasnjim racunarima ima dovoljno.
Vremenska kompleksnost - predstavlja zavisno na osnovu koje se moze ocekivati povecanje vremena
izvrsenja algoritma u zavisnosti od povecanja ulaza.
Sta znaci O(n) - vreme potrebno za izvrsavanje algoritma raste proporcionalno sa velicinom ulaza(n)
Sta znaci O(1) - konstantno vreme izvrsavanja, ne zavisi od kolicine ulaza
n - velicina ulaza(npr kod niza br elemenata, kod stringa br karaktera...)
Ako na ulazu imamo niz velicina ulaza je broj elemenata niza, ako imamo string to je broj karaktera u
stringu ...
// Objasniti da konstante nisu bitne, i da one ne trebaju da se koriste u asimptotskoj kompleksnosti jer su
zanemarljive, posmatra ponasanje algoritma kada velicina ulaza neograniceno raste
O(1) < O (log2(log2(n)))< O(log2(n)) < O(n) < O(n*log2(n)) < O(n*(log2(n))^2) < O(n ^ 2) < O(2 ^ n)
< O(n!)
Sekvencijalna pretraga
Dobre strane: primenjiva na sve linijske strukture podataka(niz, lista), ne zahteva da budu sortirane
Lose strane: O(n) kompleksnost
static int binary(int[] niz, int trazeni, int levi, int desni){
if(levi > desni) return -1;
int mid = (levi + desni) /2;
if(niz[mid] == trazeni)
return mid;
if(niz[mid] > trazeni)
return binary(niz,trazeni,levi, mid - 1);
return binary(niz,trazeni,mid+1, desni);
}
Binarna pretraga iterativno
Interpolaciono pretrazivanje
static int interpolacionoRe(int[] niz, int trazeni, int levi, int desni){
if(levi > desni) return -1;
if(niz[levi] == niz[desni]){
if(niz[levi] == trazeni)
return levi;
return -1;
}
int index = levi + (trazeni - niz[levi]) / (niz[desni] - niz[levi]) * (desni - levi);
if(niz[index] == trazeni)
return index;
if(niz[index] > trazeni)
return interpolacionoRe(niz,trazeni,levi, index - 1);
return interpolacionoRe(niz,trazeni,index + 1,desni);
Selection sort
Efikasnost O(n^2)
Prikazati na tabli kako radi
7,3,1,4,2 => 1,3,7,4,2 => 1,2,7,4,3 => 1,2,3,4,7
Bubble sort
Počinje od kraja niza i zamenjuje susedne elemente, tako da najmanji element izađe na početak,
poredi medjusobno susedne elemente
Efikasnost O(n^2)
Nacrtati na tabli
2,5,4,3,1 => 2,5,4,1,3 = > 2, 5, 1, 4, 3 => 2, 1, 5 ,4, 3 => 1,2,5,4,3 => 1, 2, 5, 3, 4 =>
1,2,3,5,4 => 1, 2, 3, 4, 5
Sink sort
Veoma slicno sto i bubble, samo sto krece od pocetka nalazi najveci element i postavlja ga na kraj,
poredi medjusobno susedne elemente
Efikasnost O(n^2)
Insetrion sort
Prolazak kroz nesortirani deo niza i ubacivanje sledeceg elementa u sortirani deo.
Efikasnost O(n^2)
8,2,4,8,5,6 => 2,8,4,9,5,6 => 2,4,8,9,5,6 => 2,4,8,9,5,6 => 2,4,5,8,9,6 => 2,4,5,6,8,9
}
niz[j] = trenutni;
}
}
Merge sort
Deli niz na dva podniza i tako rekurzivno dok ne ostane po samo jedan element, zatim se vraca unazad i
spaja podnizove(na pocetku samo po jedan element) dok ne sastavi pocetni niz u sortiranom redosledu.
Efikasnost: O(n*log2(n))
Prvo ih rastavlja
48753291
4875 3291
48 75 32 91
4 8 7 5 3 2 9
1
48 57 23 19
4578 1239
12345789
Za merge ne treba objasnjavati kod, ko hoce da pogleda nek pogleda, pa nek pita ako ima nesto
nejasno
for(int i=0;i<n1;i++){
levi[i]=niz[p+i];
}
for(int j=0;j<n2;j++){
desni[j]=niz[q+1+j];
}
int i=0,j=0, m=p;
while(i<levi.length && j<desni.length){
if(levi[i]<=desni[j]){
niz[m]=levi[i];
m++;
i++;
}else{
niz[m]= desni[j];
m++;
j++;
}
}
while(i<levi.length){
niz[m]=levi[i];
m++;
i++;
}
while(j<desni.length){
niz[m] = desni[j];
m++;
j++;
}
}
Quick sort
Sortiranje zasnovano na pivotu za koga se uzima poslednji element niza, ideja je da na kraju svakog
prolaska niz bude podeljen u dva dela levo od pivota da budu elementi manji od njega, a desno da budu
veci.
Koristi se zato sto je u prosecnom slucaju najbrzi od svih O(n*log(n)), a najgori slucaj se desava samo ako
je niz vec sortiran.
Levi index krece od prvog elementa i nastavlja dok ne dodje do veceg ili jednakog pivotu.
Desni index krece od predposlednjeg elementa i nastavlja dok ne nadje prvi manji od pivota.
Kada je levi na prvom koji je veci ili jednak a desni na prvom koji je manji ta dva elementa menjaju mesta
i to se ponavlja dok u levom delu niza ne budu manji a u densom veci elementi.
Kada se to zavrsi element na kome su se zaustavili i levi i desni idex(na prvoj poziciji od pocetka niza koji
je veci od pivota) pivot i taj element menjaju mesta.
Zatim se postupak ponavlja rekurzivno za delove niza koji su levo i desno od pivota.
Shell sort
Lista
Linearna struktura u koju se na bilo koje mesto moze ubaciti ili izbaciti element.
Prednosti u odnosu na niz : teoretski moze neograniceno da raste broj elemenata, lakse ubacivanje
elementa u sortiranu listu nego u niz(u nizu moramo da pomerimo sve elemente nakon mesta na kom je
novi element ubacen, za listu je potrebno samo da se napravi novi cvor i da se prevezu pokazivaci)
Nedostaci u odnosu na niz: manja efikasnost pretrazivanja, ne moze se implementirati algoritam brzi od
O(n), bez obzira da li je lista sortirana ili ne(vazi i za dvostruko i za jednostruko spregnutu listu), pa se iz
tog razloga za liste koristi obicna sekvencijalna pretraga.
int a = 5;
int b = a--;
a = b++ + --a;
syso(--b);
syso(a++);
//ispisuje 5 8
Ciklicna DS lista sa cetiri cvora, pom na jednom, sta je rezultat izvrsavanja koda:
pom.sledeci.prethodni.prethodni = pom.sledeci.sledeci;
pom = pom.prethodni.prethodni;
pom.sledeci.sledeci = pom.prethodni;