38
© Ivan Bilobrk Odjel za Informa5ku PMFST Strukture podataka i algoritmi 2011/2012 STRUKTURE PODATAKA I ALGORITMI sor)ranje

Sortiranje

Embed Size (px)

DESCRIPTION

Strukture podataka i algoritmi

Citation preview

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi 2011/2012

    STRUKTURE PODATAKA I ALGORITMI

    sor)ranje

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    2

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    3

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE

    Za bolje shvaanje sor)ranja potrebno je poblie denira) problem kojeg ono ima rijei)

    Dano je n elemenata koje treba sor)ra), pri emu se elemen) esto zovu zapisi (eng. record)

    Svakom od zapisa pripada odgovarajui klju 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

    4

    R1,R2 ,,Rn

    Rj K j

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    - naelo trihotomije - uvijek vrijedi tono jedan od izraza

    - tranzi:vnost - iz odnosa i lslijedi odnos

    Cilj sor)ranja je pronai permutaciju nad indeksima koja e postavi) kljueve u nepadajui poredak

    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

    5

    a,b,ca < b,a = b,a > b

    a < b b < c a < c

    p 1( ) p 2( )p n( ) 1,2,,n{ }

    Kp 1( ) Kp 2( ) Kp n( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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.

    6

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    7

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM

    Algoritmi iz ove skupine podsjeaju na algoritme koritene pri slaganju karata u kartakim igrama treeC ili remiju.

    Prije razmatranja zapisa

    - pretpostavljamo da su prethodni zapisi sor)rani

    - potom ga umeemo na odgovarajue mjesto meu prethodno sor)rane zapise

    Postoje zanimljive varijacije na ovu temu

    - inser)on sort

    - shell sort

    8

    Rj

    R1,R2 ,,Rj1

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - INSERTION SORT

    Algoritam

    I1 [Vr: se u petlji po j] Obavljaj korake I2 do I5 za a potom zavri algoritam

    I2 [Postavi i, K, R] Postavi

    I3 [Usporedi K sa Ki] Ako je idi na I5

    I4 [Pomakni Ri, smanji i] Postavi a ako je idi na I3

    I5 [Smjes: R] Postavi

    9

    j = 2,3,,ni = j 1,K = K j ,R = Rj

    u sljedeim koracima pokuat emo smjes55 R na pravo mjesto, usporeujui K s Ki za sve padajue

    vrijednos5 od iK Ki

    Pronaeno mjesto za RRi+1 = Ri ,i = i 1

    i > 0

    Ako je i = 0, tada je K najmanji do sada pronaeni klju, tako da zapis R pripada na mjestu 1

    Ri+1 = R

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - INSERTION SORT

    10

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - INSERTION SORT

    11

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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 za najgori sluaj

    12

    O n2( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - INSERTION SORT

    13

    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]

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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)

    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

    14

    O n2( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - SHELLOV SORT

    Algoritam

    S1 [Vr: se u petlji po s] Obavi korak S2 za a onda zavri algoritam

    S2 [Vr: se u petlji po j] Postavi i obavljaj korake S3 do S6 za

    S3 [Postavi i, K, R] Postavi

    S4 [Usporedi K sa Ki] Ako je idi na S6

    S5 [Pomakni Ri, smanji i] Postavi a ako je idi natrag na S4.

    S6 [Smjes: R] Postavi

    15

    s = t 1,t 2,,0h=hs

    Ri+h = Ri ,i = i h i > 0

    t je korak

    Ri+h = R

    h < j < n

    i = j h,K = K j ,R = RjK Ki

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - SHELLOV SORT

    16

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    Iscrpna istraivanja ovog problema su pokazala da je trenutno najbolji niz koraka onaj kojeg denira poljski matema)ar Marcin Ciura

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

    17

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

    O n32( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - SHELLOV SORT

    18

    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]

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - SHELLOV SORT

    19

    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);! } }

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    20

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    21

    O n2( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - IZMJENOM - BUBBLE SORT

    22

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - BUBBLE SORT

    Algoritam

    B1 [Postavi GRANICU] GRANICA = n

    B2 [Vr: se u petlji po j] Postavi . Obavi korak B3 za i za)m idi na korak B4

    B3 [Usporedi/Zamijeni Rj i Rj+1] Ako je zamijeni te postavi

    B4 [Je li bilo zamjena?] Ako je zavri algoritam. U pro)vnom GRANICA = t i vra) se na B2

    23

    Rj Rj+1

    t= 0

    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.

    K j K j+1 t= j

    j = 1,2,,GRANICA 1

    t=0

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - UMETANJEM - BUBBLE SORT

    24

    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; } }

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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 ali brzina algoritma se strahovito ubrzava u preostalim sluajevima gdje mu je sloenost reda

    25

    O n2( )O n lnn( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - IZMJENOM - QUICK SORT

    26

    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 ); } }

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - IZMJENOM - QUICK SORT

    27

    static int Particija ( int[] niz, int prvi, int zadnji ) { int pivot = prvi;

    while ( prvi < zadnji ) { if ( niz[prvi]

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    28

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - IZBOROM - SELECTION SORT

    29

    Vremenska sloenost za selec)on sort u najgorem sluaju je

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

    O n2( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - IZBOROM - SELECTION SORT

    30

    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]); } }

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    31

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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

    Merge sort je prilino brz algoritam, ali mu je najvei nedostatak to to stalno stvara nove podnizove i na taj nain zauzima puno memorije.

    32

    O n lnn( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - SPAJANJEM - MERGE SORT

    33

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - SPAJANJEM - MERGE SORT

    34

    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]

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - SPAJANJEM - MERGE SORT

    35

    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 ); } }

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    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 gdje je k broj znamenaka najveeg broja

    36

    O kn( )

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - TOTALNO DRUGAIJE - RADIX SORT

    37

    radixodredi koliko znamenaka ima max broj = kpetlja po i od 1 do k

    formiraj niz znamenaka poevi s jedinicama (1) pa s deseticama (2) do ksortiraj taj niz znamenakapetlja po j od 0 do n-1 po nizu brojeva

    etaj paralelno po nizu znamenaka i nizu brojevatrai broj sa odgovarajuom znamenkom i zamijeni ga s trenutnom (1, 2, 3...)

  • Ivan Bilobrk - Odjel za Informa5ku - PMFSTStrukture podataka i algoritmi / 38

    SORTIRANJE - RADIX SORT

    38

    Poetak 1. prolaz 2. prolaz 3. prolaz Kraj

    503 170 503 061 061087 061 908 087 087512 512 509 154 154061 612 703 170 170908 503 512 275 275170 653 612 426 426897 703 426 503 503275 154 653 509 509653 275 154 512 512426 765 061 612 612154 426 765 653 653509 087 170 677 677612 897 275 703 703677 677 677 765 765765 908 087 897 897703 509 897 908 908