You are on page 1of 19

Alfa BK Univerzitet

Seminarski rad

Teorija algoritama,jezika i automata

Algoritmi sortiranja u programskom jeziku Python

Student:Predrag Miletić

Br. indeksa 20186811


Sadržaj

1. Uvod ……………………………………………………………. 3

2.Selection sort……………………………………………………. 5

3.Merge sort ……………………………………………………… 9

4.Quick sort ……………………………………………………….14

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.

Python je interpretirani, interaktivni, objektno orijentisani programski jezik visokog


nivoa, koji poseduje dinamičku sematiku. Stvorio ga je Gvido van Rosum (Guido van Rossum)
1991. godine, a ime je dobio po kultnoj britanskoj komediji „Monty Python”. Odlikuje ga
visokokvalitetna struktura podataka, koja ga, u kombinaciji sa dinamičkim pisanjem i
vezivanjem, čini veoma atraktivnim za brz razvoj različitih aplikacija. Spada u grupu softvera
otvorenog koda, sa dobrom podrškom, dokumentacijom i pratećim bibliotekama.

Algoritam je precizno definisani postupak za izvršavanje odredenog zadatka, ili rešavanje


odgovarajuceg problema. Na primer, da bi se broj 10 pomnožio brojem 2, potrebno je rezultat
množenja postaviti na nulu, pa onda na njega dodavati broj 10 dva puta. Ovde se recept sastoji
od odredenih elementarnih postupaka (operacija), kao što je postavljanje rezultata na nulu i
sabiranje. Pojam precizno definisani postupak odnosi se na konacan skup elementarnih operacija
iz koga se bira niz operacija koje vode do rešenja u konačcno mnogo koraka.

Algoritmi sortiranja zauzimaju istaknuto mesto u racunarskim naukama. Mogu se


klasifikovati na različite načine, ali će ovde biti spomenuta podela na algoritme unutrašnjeg i
spoljašnjeg sortiranja. Unutrašnje sortiranje podrazumeva da se polazna sekvenca u potpunosti
nalazi u operativnoj memoriji, dok se kod spoljašnjeg sortiranja, zbog izuzetno velike količine
podataka, delovi sekvence nalaze na spoljnoj memoriji (najcešće disk). Imajuću vidu da procesor
isključivo radi sa podacima u operativnoj memoriji (Fon Nojmanov model racunara, glava),
algoritmi spoljašnjeg sortiranja zahtevaju kompleksnije postupke od unutrašnjih parnjaka. Pošto
su savremeni memorijski moduli dovoljno velikog kapaciteta za najveci broj inženjerskih
primena, u ´ nastavku ce se razmatrati karakterističcni algoritmi unutrašnjeg sortiranja. Neki od
njih biće rekurzivne prirode, a neke će karakterisati upotreba dodatne memorije. Opet, neki ce, u
toku postupka, koristiti operatore poređenja, a neki ne. U Pajtonu se, za sortiranje, koristi
ugradena funkcija sorted() (vraca novu uredenu sekvencu) ili metoda sort() (preureduje
postojeću listu). Ipak, poznavanje osnovnih tehnika sortiranja izoštrava umeće algoritamskog
rešavanja problema, a predstavlja i dobru vežbu za sprovodenje analize algoritamske efikasnosti.

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.

Program 2.1 - Selection sort

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

Glavna petlja po i fiksira tekuci element (r5-9). Indeks tekućegminimuma pamtiće se uz


pomoc promenljive tekući_minimum (r6). Indeks elementa koji predstavlja i-ti minimum po
redu, pronalazi se u petlji po j (r7-9). U r10, uz pomoc višestruke naredbe ´ dodele, tekuci
minimum menja mesto sa elementom na tekućoj poziciji. Empirijska analiza složenosti
sprovedena je za najnepovoljniji slucaj kada je lista sortirana u opadajucem redosledu, tako što je
izmereno trajanja postupka sortiranja (r19-25). Sledi prikaz rada programa i eksperimentalna
kriva složenosti.

6
Slika 1.2

Složenost algoritma Selection sort: funkcija složenosti, u najnepovoljnijem slucaju,


ponaša se kao kvadratna funkcija.

Da bi se pomenuti algoritam mogao iskoristiti za sortiranje u opadajuci poredak treba


samo promeniti operator poredenja iz r8 - umesto < treba staviti >. Tada bi promenljivu
tekući_min trebalo preimenovati u tekući_max, što bi odgovaralo znacenju objekta na koji
promenljiva ukazuje. Funkcija složenosti, u najnepovoljnijem ˇ slucaju, može se definisati na
bazi slede ˇ cih opažanja: ´

• obavlja se n−1 dodela vrednosti (r6), kao i isti broj razmena vrednosti (r10),

• obavlja se (n−1) + (n−2) +...+2+1 = (n−1)n 2 dodela vrednosti (r9).

Ako se pretpostavi da su Cdodela i Crazmena, vremena potrebna za izvršavanje jedne dodele


i jedne razmene vrednosti, a costalo, vreme trajanja ostalih operacija u programu, može se
formirati funkcija složenosti za najnepovoljniji slucaj:

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.

Algoritam Quick sort može se realizovati uz pomoc glavne funkcije quick_sort() i


pomocne funkcije podeli (), na sledeci način:

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.

U programu za testiranje, poredi se prosecno vreme izvršavanja algoritama ˇ Quick sort i


Mege sort (r26-47). Algoritam Mege sort, realizovan prema postupku iz 7.4.3, smešten je u
modul mergesort (r28). Petljom po n, odabira se ukupan broj elemenata liste (r31), pa se potom

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).

Algoritam Quick sort spada u najefikasnije postupke za sortiranje, u najvecem broju


prakticnih situacija. Njegov red složenosti, u ˇ proseˇcnom slucaju, iznosi O( n · log2 n). Ipak,
zbog manjih vrednosti konstanti u funkciji složenosti, on je u tom sluˇcaju, na istom racunarskom
sistemu, dosta brži od Merge sort-a. U najnepovoljnijem slucaju, njegov red složenosti iznosi
O(n 2 ), što je lošije od Merge sort-a. Medutim, važna prednost Quick sort-a, u odnosu na Merge
sort, je da ne koristi dodatnu memoriju (sortira u mestu). Interesantno je napomenuti da najgori
slucaj zavisi od vrednosti izabranog pivota (ako se uvek bira minimalni ili maksimalni element
podliste koja se sortira). U slučaju da se za pivot uzima središnji element, jedan od mogucih
najnepovoljnijih slučajeva ne odnosi se na opadajucu listu, već na listu u kojoj su svi elementi
isti! Kada je ´ lista opadajuca, već posle prve podele, i-ti elementi s pocetka i kraja zamenjuju
mesta, što rezultuje sortiranom listom. Ako su svi elementi jednaki, onda pri svakom pozivu
funkcije podeli(), svi parovi elemenata s pocetka i kraja zamenjuju mesta, uz vraćanje središnjeg
indeksa kao kraja levog podniza. Tada se tako, u svim rekurzivnim pozivima za quick_sort(),
obavlja maksimalan broj zamena.

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).

Treći kriterijum za procenu rada algoritama je sama stabilnost algoritama.

18
Literatura

www.interactivepython.org

www.google.com

www.wikipedia.org

https://petlja.org/biblioteka/r/Lectures/osnovni-algoritmi-sortiranja

19

You might also like