Professional Documents
Culture Documents
Algoritmi I Strukture Podataka II Predrag Miletic 20186811
Algoritmi I Strukture Podataka II Predrag Miletic 20186811
Seminarski rad
Student:Predrag Miletić
1. Uvod ……………………………………………………………. 3
2.Selection sort……………………………………………………. 5
5.Zaključak ……………………………………………….……….18
6.Literatura ……………………………………………………….19
2
1.Uvod
Pre nego što počnemo o algoritmima sortiranja prvo ćemo reći sta su to uopšte algoritmi i
nešto o programskom jeziku Pyhton.
3
U ovom radu ćemo obraditi sledeće metode sortiranja:
- Selction sort
- Merge sort
- Quicksort
4
2. Selection sort
Algoritam Selection sort spada u jednostavne i najcešće korišćene postupke sortiranja.
Koristi se u slucaju kada je broj elemenata, u sekvenci koju treba sortirati, veoma mali (do par
stotina). Razmatra se situacija sortiranja celobrojne liste, pri cemu se napominje da postupak
ostaje isti i u slucaju realnih brojeva. U prvom prolazu, algoritam pronalazi najmanji element iz
liste i postavlja ga na prvu poziciju. Potom se, pocevši od druge pozicije, postupak ponavlja:
traži se sledeći najmanji element u podlisti koja pocinje od ˇ druge pozicije. Neka su, u opštem
slucaju, svi brojevi levo od tekuće pozicije sortirani. Sada se, na tekuću poziciju i, postavlja
najmanji element iz podliste koja, pocevši od i, obuhvata sve elemente nadesno.
Slika 1.1.
5
Algoritam Selection sort: isprekidana linija označava tekuću poziciju, a osenčena ˇcellija,
minimalni element u desnoj podlisti. Kada se prođe kroz podlistu, najmanji element menja mesto
sa elementom na tekucoj poziciji. Brojevi koji menjaju mesto posle prve iteracije su -10 i 10.
Slika 1.2
6
Slika 1.2
• obavlja se n−1 dodela vrednosti (r6), kao i isti broj razmena vrednosti (r10),
7
ˇ tnajnep(n) = (n−1)n 2 cdodela+(n−1)cdodela+(n−1)crazmena+costalo = c1n 2+c2n+c3 .
Očigledno je da Selction sort ima vremensku složenost reda O(n 2 ), što se slaže sa rezultatom
dobijenim u eksperimentalnoj analizi (slika 1.2). Algoritam nije memorijski zahtevan jer se
sortiranje obavlja u okviru zadate liste. Za sekvence sa vecim brojem elemenata primenjuju se
efikasniji algoritmi, poput Merge sort ili Quick sort postupaka, koji su opisani u sledecem delu.
8
3. Merge sort
Metoda sortiranja Merge sort pripada familiji algoritama podeli pa vladaj, gde se pocetni
problem razlaže na svoje jednostavnije verzije, koje se obicno rešavaju u rekurzivnom maniru.
Ulazna lista sortira se uz pomoc rekurzije, tako što se podeli na dva jednaka dela koja se prvo
sortiraju, pa se potom izvrši spajanje dve sortirane polovine. U svakom rekurzivnom pozivu,
prosledena podlista deli se na polovine koje ¯ se sortiraju i potom spajaju. Bazni slucaj rekurzije
nastupa kada lista koju treba sortirati sadrži samo jedan element - lista je tada vec sortirana.
Rekurzivni postupak ilustrovan ´ je pogodnim primerom na slici 1.3. Postupak spajanja dve već
sortirane polovine, L1 i L2, neke liste L, ima sledeći oblik: neka su podliste L1 i L2 sortirane u
rastuci poredak. Lista L sortira se tako što se L1 i L2 spoje u rezultujucu listu ´ spoj, na nacin
prikazan na slici 1.4. Neka se ˇ svi elementi levo od L1[i] i L2[j] vec nalaze u listi ´ spoj, tako da
formiraju rastuci´ poredak. Sada se razmatra uslov L1[i] < L2[j].Ako je uslov ispunjen, L1[i], kao
najmanji od svih preostalih elemenata u L1 i L2, treba dodati na kraj liste spoj i uvecati indeks ´ i
za jedan. Slicno rezonovanje primenjuje se i ako uslov nije ispunjen, kada se u spoj dodaje
element L2[j], a indeks j uvecava za jedan (slika 1.4). Postupak se ponavlja sve dok se jedna od
listi potpuno ne iscrpi. Tada se preostali deo druge liste dodaje na kraj liste spoj.
Slika 1.3
Algoritam Merge sort: stablo rekurzivnih poziva. Lista se prvo deli na polovine, pa na
polovine polovina i tako redom sve do jednoelementnih listi. Potom se, obrnutim redosledom,
vrše spajanja sortiranih delova. Podele su ilustrovane crnim, a spajanja sivim strelicama.
9
Slika 1.4
Opisani nacin sortiranja ne obavlja se u mestu (u istoj listi u kojoj se nalaze podaci), vec
je potrebno odvojiti onoliko dodatnog memorijskog prostora koliko zauzima i sama lista L!
Izloženi postupak može se realizovati u Pajtonu na sledeci način:
10
Funkcija merge_sort (), pored liste L, prima i formalne parametre levo i desno. Parametri
definišu podlistu koju treba sortirati (r2). Inicijalni poziv podrazumeva navodenje opsega kojim
se definiše po ¯ cetna lista (r35, 42). Po izračunavanju središnjeg elementa (sredina), pristupa se
sortiranju prve (r6), odnosno druge polovine inicijalne liste (r7). Sortirane podliste spajaju se uz
pomoc funkcije spajanje(), cime se tekući poziv za merge_sort završava (r8). Ako ulazna lista
sadrži samo jedan element, od njega se formira jednoelementna lista (r10), a rekurzivni pozivi po
dubini okoncavaju se na toj grani pozivnog stabla (slika 1.3).
U funkciji spajanje(), na kraju petlje while, jedna od listi, L1 ili L2, obradena je ¯ u celosti (r18-
24). Preostali elementi nepotpuno obradene liste dodaju se na kraj liste ¯ spoj. Dodavanje se, bez
testiranja o kojoj listi se radi, obavlja putem dva proširenja liste spoj, uz pomoc metode ´
extend() (r26-27). Rezultat rada programa za testiranje (r32-44) i eksperimentalna analiza
složenosti, dati su u sledecem prikazu i na slici 1.5:
11
Slika 1.5
Složenost algoritma Merge sort: funkcija složenosti ima nešto brži rast od linearnog. Primenom
precizne analize utvrden je red složenosti O( n ·log2n).
Kljucni rad u algoritmu obavlja se u funkciji ˇ spajanje(). Dominantni par operacija cine ˇ pristup
odgovarajucem elementu neke od listi, te ´ dodavanje tog elementa na kraj rezultujuce liste (r20,
23, 26, 27). Za liste ´ L1 i L2, cije dužine iznose po ˇ m/2, u procesu spajanja treba izvršiti m
dominantnih parova - funkcija vremenske složenosti za spoj() može se izraziti kao Cdodavanje
m+Costalo. Ovde je, sa Cdodavanje, oznaceno ˇ vreme izvršavanja dominantnog para operacija, sa m,
dužina rezultujuce liste, a sa Costalo, vreme izvršavanja svih ostalih operacija u funkciji.
Da bi se definisala funkcija složenosti kompletnog postupka, može se, kao i prilikom binarnog
pretraživanja, bez gubitka opštosti pretpostaviti da je broj elemenata u listi, n = 2 k . Uociti bilo
koju putanju u stablu sa slike 1.3, od početne do jednoelementne liste (na primer, krajnje levu
koja vodi do broja [8]). Da bi se stiglo do jednoelementne liste, na svakoj od putanja treba
obaviti k sukcesivnih podela (k nivoa u stablu). U prvom nivou, ispod polazne liste, obavlja se
samo jedno spajanje sortiranih podlista od po n/2 elemenata. Zato ova faza u sortiranju ima
složenost reda O(n).
U drugom nivou, obavljaju se dva spajanja u rezultujuce liste koje imaju po n/2 elemenata, što
odgovara funkciji vremenske složenosti 2(Cdodavanjen/2 + Costalo) = Cdodavan je n+2Costalo.
Ocigledno, ova faza ima složenost reda O( ˇ n). Slicnom analizom ˇ zakljucuje se da je, u svakoj
fazi sortiranja, funkcija vremenske složenosti reda O(n). Pošto se u kompletnom postupku obavi
k = log2 n ovakvih faza, može se zakljuciti ˇ da red složenosti algoritma Merge sort iznosi O(n ·
log2 n). Za algoritme navedenog reda složenosti kaže se da se izvršavaju u kvazilinearnom
vremenu. Kvazilinearni algoritmi sporiji su u odnosu na linearne, ali i dosta brži u odnosu na
kvadratne, pa se problemi, koji se na ovaj nacin mogu rešiti, smatraju efikasno rešivim. Treba
istaćida se u algoritmima za sortiranje, koji se zasnivaju na poredenjima, a koji se mogu
primeniti na bilo koju listu objekata (što Counting sort svakako nije), ne može postići složenost
manja od O(n ·log2 n).
12
Ocigledna prednost metode Merge sort, u odnosu na Selection sort, ogleda se u brzini
izvršavanja prilikom velikog broja podataka. Medutim, treba uočiti i nedostatak koji se odnosi
na dodatnu memoriju koja je, za razliku od metode Selection sort, u ovom slucaju neophodna.
13
3.Quick sort
Metoda sortiranja Quick sort pripada familiji algoritama “podeli pa vladaj”. Neka se pocetna lista
L sortira u rastuci poredak. Lista L se prvo podeli na dve podliste, tako da su svi elementi prve, manji ili
jednaki u odnosu na elemente druge podliste. Potom se svaka podlista, ako ima bar dva elementa,
rekurzivno sortira tako što se podeli na isti nacin. U baznom slučaju, kada podlista ima jedan ili nula
elemenata, sortiranje nije potrebno. Pomenuta podela liste L, postiže se izborom proizvoljnog elementa
(obicno ˇ središnjeg), koji se naziva pivot. U postupku podele uvode se dva indeksa koji polaze sa
razlicitih krajeva liste (levi s početka, a desni s kraja). Potom se, za svaki element koji je veci od pivota, a
na koga ukazuje levi indeks, odnosno za svaki element koji je manji od pivota, a na koga ukazuje desni
indeks, vrši zamena mesta (slika 1.6). Na ovaj nacin, održava se svojstvo da su svi elementi leve
podliste, ˇ ne ve´ci od elemenata u desnoj podlisti. Postupak podele završava se kada levi indeks
postane veci ili jednak u ´ odnosu na desni.
Slika 1.6
14
Algoritam Quick sort: postupak podele na dve podliste. Svi elementi leve podliste (svetlo
sivo), manji su ili jednaki u odnosu na sve elemente desne podliste (tamno sivo). Pivot, u odnosu
na koga se formira podela, može biti proizvoljan element iz liste.
15
Funkciji quick_sort() (r2-7), prosleduje se lista koja se sortira ( L), kao i granice u okviru
kojih se vrši sortiranje (levo i desno). Desna granica odnosi se na poslednji element u listi pa se
sortiranje vrši sa quick_sort(L,0,n-1), gde n oznacava dužinu liste. Ako lista ima bar dva
elementa (r4), onda se u r5 poziva funkcija podeli() (r9-23), koja preureduje listu na način sa
slike 1.6. Tom prilikom vraća se vrednost pozicije u listi koja predstavlja kraj leve podliste (p).
Potom se vrši rekurzivno sortiranje leve (r6), odnosno desne podliste (r7). U prikazanoj
implementaciji, za pivot se uzima središnji element u listi (r13). Međutim, treba zapaziti da
postupak ne zavisi od nacina izbora pivota.
16
generiše 100 listi sa po n slucajnih celih brojeva iz intervala [1,n] (r34, 36, 37). Uočiti da se
generisana lista L1, koja ce se sortirati uz pomoć algoritma Mege sort (r39-41), kopira u r37,
kako bi se pod istim uslovima testiralo vreme izvršavanja za algoritam Quick sort (r43-45).
17
Zaključak
Algoritmi sortiranja su važan deo upravljanja podataka. Svaki algoritam ima određene prednosti i
nedostatke te u mnogim slučajevima najbolja stvar za učiniti je samo koristiti ugrađene funkcije za
sortiranje qsort. Za vreme kada to nije opcija i kad samo trebate brzo i neuredno sortiranje pomoću
algoritama, postoji mogućnost izbora.
Većina algoritama za sortiranje radi se poredjenjem podataka koji se sortiraju. U nekim slučajevima,
može biti poželjno rešiti veliki komad podataka na temelju samo jednog dela tih podataka. Mnogi
algoritmi koji imaju istu produktivnost nemaju istu brzinu na istom ulazu.
Prvi kriterijum, algoritmi moraju biti posmatrani na temelju njihovog prosečnog slučaja, najboljeg
i najgoreg slučaja. Neki algoritmi, kao što je quicksort, će obavljati dobro za neke ulaze, ali strašno za
druge. Ostali algoritmi kao što su merge sort, ne zavise o vrsti ulaznih podatakaDrugi kriterijum za
posmatranje,procenu algoritama je njihov zahtev za prostorom, da li oni zahtevaju brisanje prostora ili će
niz biti razvrstani u mestu (bez dodatne memorije izvan nekoliko varijabli)? Neki algoritmi nikada ne
zahtevaju dodatni prostor, dok su neki najlakši algoritmi nerazumljivi jer se koriste pomoćnim prostorom.
Potreban prostor možda čak i zavisi o strukturi podataka koji se koristi (spajanje sortiranje polja u odnosu
na spajanje sortiranje povezane liste, na primer).
18
Literatura
www.interactivepython.org
www.google.com
www.wikipedia.org
https://petlja.org/biblioteka/r/Lectures/osnovni-algoritmi-sortiranja
19