forelesning 3 læringsmål - algoritmer og datastrukturerforelesning splitt & hersk 3 11 12 1....

401
Forelesning 3 Rekursiv dekomponering er kanskje den viktigste ideen i hele faget, og designmetoden splitt og hersk er en grunnleggende utgave av det: Del instansen i mindre biter, løs problemet rekursivt for disse, og kombinér løsningene. Pensum Kap. 2. Getting started: 2.3 Kap. 4. Divide-and-conquer: Innledning, 4.1 og 4.3–4.5 Kap. 7. Quicksort Oppgaver 2.3-5 og 4.5-3 med løsning (binærsøk) Appendiks B og C i pensumheftet Læringsmål [C 1 ] Forstå divide-and-conquer (splitt og hersk ) [C 2 ] Forstå maximum-subarray - problemet med løsninger [C 3 ] Forstå Bisect og Bisect Õ (se appendiks C i pensumheftet) [C 4 ] Forstå Merge-Sort [C 5 ] Forstå Quicksort og Randomized-Quicksort [C 6 ] Kunne løse rekurrenser med substitusjon , rekursjonstrær og masterteoremet [C 7 ] Kunne løse rekurrenser med iterasjonsmetoden (se appendiks B i pensumheftet) [C 8 ] Forstå hvordan variabelskifte fungerer mlh @ ntnu.no 1

Upload: others

Post on 30-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Forelesning 3

    Rekursiv dekomponering er kanskjeden viktigste ideen i hele faget, ogdesignmetoden splitt og hersk er engrunnleggende utgave av det: Delinstansen i mindre biter, løs problemetrekursivt for disse, og kombinérløsningene.

    Pensum

    ⇤ Kap. 2. Getting started: 2.3

    ⇤ Kap. 4. Divide-and-conquer:Innledning, 4.1 og 4.3–4.5

    ⇤ Kap. 7. Quicksort

    ⇤ Oppgaver 2.3-5 og 4.5-3 medløsning (binærsøk)

    ⇤ Appendiks B og C i pensumheftet

    Læringsmål

    [C1] Forstå divide-and-conquer (splittog hersk)

    [C2] Forstå maximum-subarray-problemet med løsninger

    [C3] Forstå Bisect og BisectÕ (se

    appendiks C i pensumheftet)

    [C4] Forstå Merge-Sort

    [C5] Forstå Quicksort ogRandomized-Quicksort

    [C6] Kunne løse rekurrenser medsubstitusjon, rekursjonstrær ogmasterteoremet

    [C7] Kunne løse rekurrenser mediterasjonsmetoden (seappendiks B i pensumheftet)

    [C8] Forstå hvordan variabelskiftefungerer

    mlh@

    ntnu.no

    1

  • Forelesningen filmes

    2

  • d&c

    Dette er den velkjente induksjonsstigen vår

    mlh@

    ntnu.no

    3

  • d&c

    Vi reduserer en instans til mindre instanser . . .

    mlh@

    ntnu.no

    4

  • d&c

    . . . til vi treffer grunntilfellet

    mlh@

    ntnu.no

    5

  • d&c

    Vi løser grunntilfellet og bygger vi oss opp igjen

    mlh@

    ntnu.no

    6

  • d&c

    Alle induktive trinn er like, så ser bare på ett av dem

    mlh@

    ntnu.no

    7

  • d&c

    Men vi kan også spalte i flere delinstanser

    mlh@

    ntnu.no

    8

  • d&c

    Men vi kan også spalte i flere delinstanser

    mlh@

    ntnu.no

    9

  • d&c

    Denne designmetoden kalles «splitt og hersk» (divide & conquer)

    mlh@

    ntnu.no

    10

  • Forelesning

    Splitt &

    hersk3

    11

  • 12

    1. Rekurrenser

    2. Binærsøk

    3. Merge sort

    4. Quicksort

    5. Masterteoremet

    6. Variabelskifte 4.1: Selvstudium

  • Rekurrenser

    13

    1:6Fibonacci-sekvensen (fra Liber Abaci, 1228)

    Én ting er at vi her regner på kjøretider, men merk at strukturen til utregningene og bevisene er den samme som for algoritmedesign og korrekthetsbevis – det er bare «innholdet» som er forskjellig. Det å forstå rekurrensregning kan være nyttig for å bedre forstå rekursiv dekomponering og algoritmedesign generelt – ikke bare for kjøretidsberegninger.

  • • Rekurrens: Rekursiv ligning

    • Beskriver f.eks. kjøretiden til

    rekursive algoritmer

    • Må kvitte oss med den rekursive biten

    14

  • • Finn løsning:

    • Iterasjonsmetoden

    • Rekurrenstrær

    • Masterteoremet (senere i dag)

    • Verifisér løsning:

    • Substitusjon (dvs. induksjon)

    15

    Iterasjonsmetoden står ikke oppført som læringsmål (en forglemmelse!) – men den er pensum (og står også oppført som pensum).

    «Iterasjonsmetoden»: Gjentatt ekspandering av den rekursive forekomsten av funksjonen – det gir oss en sum som vi kan regne ut.

  • d&c › rekurrenser

    T(1) = 1

    Antar stort sett dette (evt. T(1) = O(1), e.l.)

    mlh@

    ntnu.no

    16

  • 17

    Eksempel: 1 + 1 + …

  • d&c › rekurrenser

    T(n) = T(n − 1) + 1

    mlh@

    ntnu.no

    18

  • d&c › rekurrenser

    T(n) = T(n − 1) + 1

    Ett rekursivt kall (størrelse n − 1) pluss én operasjon

    mlh@

    ntnu.no

    19

  • d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n − 1)

    mlh@

    ntnu.no

    20

    Rekurre

    ns-tre

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + T(n − 1) (1)

    21

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + T(n − 1) (1)

    22

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + T(n − 1 − 1) (2)

    23

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + T(n − 2) (2)

    24

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + T(n − 3) (3)

    25

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n − ?) (?)

    26

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n − ?) (n − 1)

    27

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n − (n − 1)) (n − 1)

    28

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(1) (n − 1)

    29

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + 1 (n − 1)

    30

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = 1 + T(n − 1)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + 1 (n − 1)

    T(n) = n

    31

  • 32

    VerifikasjonMed substitusjon/induksjon

    Her må vi også huske å verifisere at grunntilfellet (f.eks. T(1)=1) stemmer med løsningen vår. Det har jeg ikke eksplisitt diskutert her, men det stemmer for de eksemplene vi ser på.

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    33

    Denne løsningen har vi kommet frem til litt uformelt – vi kan verifisere den med induksjon. Det kalles «substitusjonsmetoden», og den kan også brukes om vi bare *gjetter* svaret.

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    34

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    35

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    = (n − 1) + 1

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    36

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    = (n − 1) + 1

    = n − 1 + 1

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    37

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    = (n − 1) + 1

    = n − 1 + 1

    = n

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    38

  • mlh@

    ntnu.no

    d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n) = T(n − 1) + 1

    = (n − 1) + 1

    = n − 1 + 1

    = n

    Gitt antagelsen T(n − 1) = n − 1, vis at T(n) = n

    39

  • d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n − 1)

    mlh@

    ntnu.no

    40

  • d&c › rekurrenser › T(n) = T(n − 1) + 1

    T(n − 1)

    T(n) = n

    mlh@

    ntnu.no

    41

  • Binærsøk

    42

    2:6Sir Thomas Little Heath sin beskrivelse av Herons metode for å approksimere kvadratrøtter ved hjelp av en nær slektning av binærsøk – en metode som antagelig ble brukt allerede av babylonerne.

    (Heath, A History of Greek Mathematics, vol. 2, 1921; Fowler & Robson, Square Root Approximations in Old Babylonian Mathematics: YBC 7289 in Context, 1998)

    Her bruker vi strengt tatt fortsatt bare én delinstans – men strategien med å halvere instansen er en vanlig ingrediens i mer typiske D&C-algoritmer (som vi straks skal se på).

  • • Sortert sekvens

    • Er det du leter etter i første halvdel?

    • Hvis ja: Let videre der

    • Hvis nei: Let i den andre halvdelen

    43

  • d&c › binærsøk

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    (Anta at kortet ditt er 6)

    mlh@

    ntnu.no

    44

    Her sjekker jeg bare hvilken halvdel jeg skal lete i – og sjekker ikke om kortet vi ser på er det vi er ute etter før vi kommer til bunnen. I pseudokoden senere har vi den sjekken i tillegg.

  • d&c › binærsøk

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    Er kortet større enn A[4]?

    mlh@

    ntnu.no

    45

  • d&c › binærsøk

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    55

    5

    66

    6

    77

    7 88

    8

    Er kortet større enn A[6]?

    mlh@

    ntnu.no

    46

  • d&c › binærsøk

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    55

    5

    66

    6

    77

    7 88

    8

    55

    5

    66

    6

    Er kortet større enn A[5]?

    mlh@

    ntnu.no

    47

  • d&c › binærsøk

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    55

    5

    66

    6

    77

    7 88

    8

    55

    5

    66

    6

    66

    6

    Er A[6] kortet ditt?

    mlh@

    ntnu.no

    48

  • d&c › binærsøk

    11

    1

    11

    1

    11

    1

    11

    1

    1

    lg n

    Antall spørsmål: lg n + 1

    mlh@

    ntnu.no

    49

  • Bisect(A, p, r, v)

    A er sortert. Om mulig, finn en indeks i så A[i] == v

    A tabellp venstrer høyrev søkeverdi

    d&c › binærsøk

    mlh@

    ntnu.no

    50

  • Bisect(A, p, r, v)

    Har vi i det hele tatt et segment å lete i?

    1 if p Æ r

    A tabellp venstrer høyrev søkeverdi

    d&c › binærsøk

    mlh@

    ntnu.no

    51

  • Bisect(A, p, r, v)1 if p Æ r

    Del på midten

    2 q = Â(p + r)/2Ê

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    52

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê

    Er dette verdien vi leter etter?

    3 if v == A[q]

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    53

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]

    I så fall er vi ferdige

    4 return q

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    54

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q

    Ellers: Må v ligge til venstre?

    5 elseif v < A[q]

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    55

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]

    Let videre til venstre

    6 return Bisect(A, p, q ≠ 1, v)

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    56

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)

    Ellers må v ligge til høyre, så vi leter videre der

    7 else return Bisect(A, q + 1, r, v)

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    57

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)

    Vi fant ikke v, så vi returnerer nil

    8 return nil

    A tabellp venstrer høyrev søkeverdiq midten

    d&c › binærsøk

    mlh@

    ntnu.no

    58

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    59

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    60

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    61

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    62

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    63

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    64

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    65

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    66

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    67

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    68

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    69

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    70

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    71

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    72

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! 5

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    73

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    74

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! 5

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    75

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    76

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! 5

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    77

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    78

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    79

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    80

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    81

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    82

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    83

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    84

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    85

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    86

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    q

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    87

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    88

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    89

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    90

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    91

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, q, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    92

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    r

    p

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    93

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    r

    p

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    94

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    r

    p

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4 › 5, 4, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    95

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    96

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p, r

    p, r, v = 1, 8, 4 › 5, 8, 4 › 5, 5, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    97

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    98

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4 › 5, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    99

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    100

  • Bisect(A, p, r, v)1 if p Æ r2 q = Â(p + r)/2Ê3 if v == A[q]4 return q5 elseif v < A[q]6 return Bisect(A, p, q ≠ 1, v)7 else return Bisect(A, q + 1, r, v)8 return nil

    ! nil

    1 1

    2 2

    2 3

    3 4

    5 5

    5 6

    6 7

    7 8

    p

    r

    p, r, v = 1, 8, 4

    d&c › binærsøk

    mlh@

    ntnu.no

    101

  • d&c › binærsøk

    T(n) = T(n/2) + 1

    mlh@

    ntnu.no

    102

    Her gjør jeg endel antagelser/forenklinger, f.eks. at delproblemet har størrelse n/2 og ikke n/2 – 1 – og at vi ikke finner v før vi har kommet til bunnen. Disse antagelsene har ikke noe å si for den asymptotiske worst-case-kjøretiden.

  • d&c › binærsøk

    T(n) = T(n/2) + 1

    Ett rekursivt kall (størrelse n/2) pluss én operasjon

    mlh@

    ntnu.no

    103

  • d&c › binærsøk › T(n) = T(n/2) + 1

    T(n/2)

    mlh@

    ntnu.no

    104

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + T(n/2) (1)

    105

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + T(n/2) (1)

    106

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + T(n/2/2) (2)

    107

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + T(n/4) (2)

    108

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + T(n/8) (3)

    109

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n/2?) (?)

    110

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n/2?) (lg n)

    111

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n/2lg n) (lg n)

    112

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(n/n) (lg n)

    113

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + T(1) (lg n)

    114

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + 1 (lg n)

    115

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = 1 + T(n/2)

    T(n) = 1

    + 1 (1)

    + 1 (2)

    + 1 (3)

    ......

    + 1 (lg n)

    T(n) = lg n + 1

    116

  • 117

    VerifikasjonMed substitusjon/induksjon

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    118

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    119

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    120

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    = (lgn

    2+ 1) + 1

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    121

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    = (lgn

    2+ 1) + 1

    = lg n − lg 2 + 2

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    122

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    = (lgn

    2+ 1) + 1

    = lg n − lg 2 + 2

    = lg n + 1

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    123

  • mlh@

    ntnu.no

    d&c › binærsøk › T(n) = T(n/2) + 1

    T(n) = T(n/2) + 1

    = (lgn

    2+ 1) + 1

    = lg n − lg 2 + 2

    = lg n + 1

    Gitt T(k) = lg k + 1 for k < n, vis T(n) = lg n + 1

    124

  • d&c › binærsøk › T(n) = T(n/2) + 1

    T(n/2)

    mlh@

    ntnu.no

    125

  • d&c › binærsøk › T(n) = T(n/2) + 1

    T(n/2)

    T(n) = lg n + 1

    mlh@

    ntnu.no

    126

  • 254

    ©

    • D . E

    . K n u

    t h

    X: ,~5

    ) ~

    ~, , z, ,

    ... :

    ¢ ) T

    Y, o)

    w ' .~ ' - .

    ~ . , .~

    ~,) ~ . ,

    7,, ,,'> ,

    . : ,~ ,.,

    ., - : / t .

    . . . . ,-

    ~,) a- -

    . 7i,

    ~2) / ¢ " /

    r .,o,

    "d,"," "

    , ' . ~ ",

    -

    . - ~. ) ...

    ~ "~

    ~ , .~.

    /o,) ~ - .

    ~" I

    Ab/A~I~¢

    7~,..,..,, . ,

    ~ ,, ~

    .,.,.,.~.,,

    -f" ,'¢.~

    ~ ~.,:,

    ~ a, /,,

    , /,, /,.,

    c,~,) ~

    co,,.v, -- , '

    , .~-~,/- , .~

    / ' , - - ~

    "~,-~ "I"

    < ~2 .

    FIG. 1.

    The

    or igina l

    manus

    c r i pt .

    simply

    change

    d line

    27 to

    "SEL B

    ETA,

    GAMM

    A", om

    itting li

    nes 24,

    25, 30,

    31, 32,

    33, 34,

    35 entir

    ely, an

    d then

    he could

    have

    used B

    ETA a

    nd GA

    MMA

    instead

    of

    ALPHA

    1 and A

    LPHA2

    in the r

    emainde

    r of

    the prog

    ram. Th

    is would

    have sa

    ved fou

    r of

    the prec

    ious sh

    ort tank

    locati

    ons, an

    d it

    would h

    ave m

    ade th

    e calcu

    lation s

    lightly

    faster.

    Similarl

    y line 3

    6 is unn

    ecessary

    , since

    location

    EXIT

    could b

    e stored

    in LDE

    LTA.

    Computi

    ng Surve

    ys, Voi. 2

    , No. 4,

    Decemb

    er 19T0

    Merge sort

    127

    3:6Kalles også «flettesortering» på norsk.

    «[Von Neumann’s] manuscript, written in ink, is 23 pages long; the first page still shows traces of the penciled phrase "TOP SECRET," which was subsequently erased. (In 1945, work on computers was classified, due to its connections with military problems.)»

    Donald Knuth, «Von Neumann’s First Computer Program»

    http://dl.acm.org/citation.cfm?doid=356580.356581

  • • Sortér venstre halvdel rekursivt

    • Sortér høyre halvdel rekursivt

    • Flett sammen halvdelene

    128

  • • Sortér venstre halvdel rekursivt

    • Sortér høyre halvdel rekursivt

    • Flett sammen halvdelene

    129

  • Merge(A, p, q, r)

    Flett sorterte segmenter A[p . . q] og A[q + 1 . . r]

    A tabellp venstreq midtenr høyre

    d&c › merge sort

    mlh@

    ntnu.no

    130

  • Merge(A, p, q, r)

    Lengden til første segment, A[p . . q]

    1 n1 = q − p + 1

    A tabellp venstreq midtenr høyren1 v. lengde

    d&c › merge sort

    mlh@

    ntnu.no

    131

  • Merge(A, p, q, r)1 n1 = q − p + 1

    Lengden til andre segment, A[p + 1 . . r]

    2 n2 = r − q

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengde

    d&c › merge sort

    mlh@

    ntnu.no

    132

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q

    Vi kopierer midlertidig innholdet i A[p . . q] og A[q + 1 . . r] til L og R

    3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.

    d&c › merge sort

    mlh@

    ntnu.no

    133

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]

    For hver indeks i i L . . .

    4 for i = 1 to n1

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i L

    d&c › merge sort

    mlh@

    ntnu.no

    134

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n1

    Kopier tilsvarende element fra A[p . . q]

    5 L[i] = A[p + i − 1]

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i L

    d&c › merge sort

    mlh@

    ntnu.no

    135

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]

    For hver indeks j i R . . .

    6 for j = 1 to n2

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    136

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n2

    Kopier tilsvarende element fra A[q + 1 . . r]

    7 R[j] = A[q + j]

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    137

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]

    Vaktpost (sentinel) så vi slipper å sjekke om vi er ved slutten

    8 L[n1 + 1] = ∞

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    138

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]8 L[n1 + 1] = ∞

    Vaktpost (sentinel) så vi slipper å sjekke om vi er ved slutten

    9 R[n2 + 1] = ∞

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    139

  • Merge(A, p, q, r)1 n1 = q − p + 12 n2 = r − q3 new: L[1 . . n1 + 1], R[1 . . n2 + 1]4 for i = 1 to n15 L[i] = A[p + i − 1]6 for j = 1 to n27 R[j] = A[q + j]8 L[n1 + 1] = ∞9 R[n2 + 1] = ∞

    10 . . .

    A tabellp venstreq midtenr høyren1 v. lengden2 h. lengdeL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    140

  • Merge(A, p, q, r)10 . . .

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    141

  • Merge(A, p, q, r)10 . . .

    Hvor er vi i L?

    11 i = 1

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    142

  • Merge(A, p, q, r)10 . . .11 i = 1

    Hvor er vi i R?

    12 j = 1

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i R

    d&c › merge sort

    mlh@

    ntnu.no

    143

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 1

    Vi setter inn i A[p . . r]. For hver indeks k, bruk min{L[i], R[j]}

    13 for k = p to r

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    144

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r

    Hvis L[i] er minst . . .

    14 if L[i] Æ R[j]

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    145

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]

    Bruk L[i]

    15 A[k] = L[i]

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    146

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]

    Vi har brukt L[i], så vi flytter oss videre

    16 i = i + 1

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    147

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]16 i = i + 1

    Ellers så er R[j] minst, så vi bruker den

    17 else A[k] = R[j]

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    148

  • Merge(A, p, q, r)10 . . .11 i = 112 j = 113 for k = p to r14 if L[i] Æ R[j]15 A[k] = L[i]16 i = i + 117 else A[k] = R[j]

    Vi har brukt R[j], så vi flytter oss videre

    18 j = j + 1

    A tabellp venstreq midtenr høyreL kopi, v.R kopi, h.i pos. i Lj pos. i Rk pos. i A

    d&c › merge sort

    mlh@

    ntnu.no

    149

  • d&c › merge sort

    Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    Forenklet fremstilling av samme prosedyre

    mlh@

    ntnu.no

    150

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    2 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    151

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    2 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    k, p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    152

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    2 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    k, p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    153

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    k, p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    154

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    k, p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    155

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    156

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    4 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    157

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    158

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    159

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    160

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    5 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    161

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    2 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    162

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    2 3

    7 4

    1 5

    2 6

    3 7

    6 8

    p

    k

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5

    i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5

    j

    d&c › merge sort

    mlh@

    ntnu.no

    163

    . . .

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    k, r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5j

    d&c › merge sort

    mlh@

    ntnu.no

    164

  • Merge(A, p, q, r)1 copy into L and R2 for k = p to r3 if L[i] Æ R[j]4 A[k] = L[i]5 i = i + 16 else A[k] = R[j]7 j = j + 1

    A

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    p

    r

    L

    2 1

    4 2

    5 3

    7 4

    ∞ 5i

    R

    1 1

    2 2

    3 3

    6 4

    ∞ 5j

    d&c › merge sort

    mlh@

    ntnu.no

    165

  • • Sortér venstre halvdel rekursivt

    • Sortér høyre halvdel rekursivt

    • Flett sammen halvdelene

    166

  • • Sortér venstre halvdel rekursivt

    • Sortér høyre halvdel rekursivt

    • Flett sammen halvdelene

    167

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    Skal sortere A[1 . . 8]

    mlh@

    ntnu.no

    168

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    Sortér først A[1 . . 4] og så A[5 . . 8]

    mlh@

    ntnu.no

    169

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    Skal sortere A[1 . . 4]

    mlh@

    ntnu.no

    170

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    Sortér først A[1 . . 2] og så A[3 . . 4]

    mlh@

    ntnu.no

    171

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    Skal sortere A[1 . . 2]

    mlh@

    ntnu.no

    172

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    Sortér først A[1] og så A[2]

    mlh@

    ntnu.no

    173

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    88

    8

    A[1] er sortert

    mlh@

    ntnu.no

    174

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    Sortér først A[1] og så A[2]

    mlh@

    ntnu.no

    175

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    77

    7

    A[2] er sortert

    mlh@

    ntnu.no

    176

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    88

    8

    77

    7

    Flett sammen A[1] og A[2]

    mlh@

    ntnu.no

    177

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    88

    8 77

    7

    66

    6

    55

    5

    77

    7

    88

    8

    A[1 . . 2] er sortert

    mlh@

    ntnu.no

    178

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    Sortér først A[1 . . 2] og så A[3 . . 4]

    mlh@

    ntnu.no

    179

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    Skal sortere A[3 . . 4]

    mlh@

    ntnu.no

    180

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    Sortér først A[3] og så A[4]

    mlh@

    ntnu.no

    181

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    66

    6

    A[3] er sortert

    mlh@

    ntnu.no

    182

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    Sortér først A[3] og så A[4]

    mlh@

    ntnu.no

    183

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    55

    5

    A[4] er sortert

    mlh@

    ntnu.no

    184

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    66

    6

    55

    5

    Flett sammen A[3] og A[4]

    mlh@

    ntnu.no

    185

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    66

    6

    55

    5

    55

    5

    66

    6

    A[3 . . 4] er sortert

    mlh@

    ntnu.no

    186

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    77

    7 88

    8

    55

    5

    66

    6

    Flett sammen A[1 . . 2] og A[3 . . 4]

    mlh@

    ntnu.no

    187

  • d&c › merge sort

    88

    8

    77

    7

    66

    6

    55

    5

    44

    4

    33

    3

    22

    2

    11

    1

    55

    5 66

    6

    77

    7

    88

    8

    A[1 . . 4] er sortert

    mlh@

    ntnu.no

    188

  • d&c › merge sort

    55

    5

    66

    6

    77

    7

    88

    8

    44

    4

    33

    3

    22

    2

    11

    1

    Sortér først A[1 . . 4] og så A[5 . . 8]

    mlh@

    ntnu.no

    189

    . . .

  • d&c › merge sort

    55

    5

    66

    6

    77

    7

    88

    8

    11

    1

    22

    2

    33

    3

    44

    4

    Flett sammen A[1 . . 4] og A[5 . . 8]

    mlh@

    ntnu.no

    190

  • d&c › merge sort

    11

    1

    22

    2

    33

    3

    44

    4

    55

    5

    66

    6

    77

    7

    88

    8

    A[1 . . 8] er sortert

    mlh@

    ntnu.no

    191

  • d&c › merge sort

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1 11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1 11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1 11

    1

    11

    1

    11

    1

    11

    1 11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    11

    1

    1 n

    1

    lg n

    mlh@

    ntnu.no

    192

  • d&c › merge sort

    Merge-Sort(A, p, r)

    Sortér A[p . . r] ved å sortere halvdelene først

    mlh@

    ntnu.no

    193

  • d&c › merge sort

    Merge-Sort(A, p, r)

    Hvis A[p . . r] har lengde minst 2 . . .

    1 if p < r

    mlh@

    ntnu.no

    194

  • d&c › merge sort

    Merge-Sort(A, p, r)1 if p < r

    Del på midten

    2 q = Â(p + r)/2Ê

    mlh@

    ntnu.no

    195

  • d&c › merge sort

    Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê

    Sortér A[p . . q] rekursivt

    3 Merge-Sort(A, p, q)

    mlh@

    ntnu.no

    196

  • d&c › merge sort

    Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)

    Sortér A[q + 1 . . r] rekursivt

    4 Merge-Sort(A, q + 1, r)

    mlh@

    ntnu.no

    197

  • d&c › merge sort

    Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)

    Flett sorterte segmenter A[p . . q] og A[q + 1 . . r]

    5 Merge(A, p, q, r)

    mlh@

    ntnu.no

    198

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8

    d&c › merge sort

    mlh@

    ntnu.no

    199

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8

    d&c › merge sort

    mlh@

    ntnu.no

    200

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    q

    r

    p, r = 1, 8

    d&c › merge sort

    mlh@

    ntnu.no

    201

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4

    d&c › merge sort

    mlh@

    ntnu.no

    202

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4

    d&c › merge sort

    mlh@

    ntnu.no

    203

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    q

    r

    p, r = 1, 8 › 1, 4

    d&c › merge sort

    mlh@

    ntnu.no

    204

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 1, 2

    d&c › merge sort

    mlh@

    ntnu.no

    205

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 1, 2

    d&c › merge sort

    mlh@

    ntnu.no

    206

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, q

    r

    p, r = 1, 8 › 1, 4 › 1, 2

    d&c › merge sort

    mlh@

    ntnu.no

    207

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, r

    p, r = 1, 8 › 1, 4 › 1, 2 › 1, 1

    d&c › merge sort

    mlh@

    ntnu.no

    208

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 1, 2

    d&c › merge sort

    mlh@

    ntnu.no

    209

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, r

    p, r = 1, 8 › 1, 4 › 1, 2 › 2, 2

    d&c › merge sort

    mlh@

    ntnu.no

    210

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 1, 2

    d&c › merge sort

    mlh@

    ntnu.no

    211

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4

    d&c › merge sort

    mlh@

    ntnu.no

    212

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 3, 4

    d&c › merge sort

    mlh@

    ntnu.no

    213

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 3, 4

    d&c › merge sort

    mlh@

    ntnu.no

    214

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, q

    r

    p, r = 1, 8 › 1, 4 › 3, 4

    d&c › merge sort

    mlh@

    ntnu.no

    215

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, r

    p, r = 1, 8 › 1, 4 › 3, 4 › 3, 3

    d&c › merge sort

    mlh@

    ntnu.no

    216

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 3, 4

    d&c › merge sort

    mlh@

    ntnu.no

    217

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p, r

    p, r = 1, 8 › 1, 4 › 3, 4 › 4, 4

    d&c › merge sort

    mlh@

    ntnu.no

    218

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    6 3

    5 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4 › 3, 4

    d&c › merge sort

    mlh@

    ntnu.no

    219

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    5 3

    6 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 1, 4

    d&c › merge sort

    mlh@

    ntnu.no

    220

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    5 3

    6 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8

    d&c › merge sort

    mlh@

    ntnu.no

    221

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    5 3

    6 4

    2 5

    1 6

    7 7

    3 8

    p

    r

    p, r = 1, 8 › 5, 8

    d&c › merge sort

    mlh@

    ntnu.no

    222

    . . .

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    2 1

    4 2

    5 3

    6 4

    1 5

    2 6

    3 7

    7 8

    p

    r

    p, r = 1, 8

    d&c › merge sort

    mlh@

    ntnu.no

    223

  • Merge-Sort(A, p, r)1 if p < r2 q = Â(p + r)/2Ê3 Merge-Sort(A, p, q)4 Merge-Sort(A, q + 1, r)5 Merge(A, p, q, r)

    1 1

    2 2

    2 3

    3 4

    4 5

    5 6

    6 7

    7 8

    mlh@

    ntnu.no

    224

  • d&c › merge sort

    T(n) = 2T(n/2) + n

    mlh@

    ntnu.no

    225

  • d&c › merge sort

    T(n) = 2T(n/2) + n

    To rekursive kall (størrelse n/2) pluss n operasjoner

    mlh@

    ntnu.no

    226

  • d&c › merge sort › T(n) = 2T(n/2) + n

    T(n/2)

    mlh@

    ntnu.no

    227

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + 2T(n/2) (1)

    228

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + 2T(n/2) (1)

    229

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + 2 · n/2 (1)

    + 2 · 2T(n/2/2) (2)

    230

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + 4T(n/4) (2)

    231

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + 8T(n/8) (3)

    232

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + 2? · T(n/2?) (?)

    233

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + 2? · T(n/2?) (lg n)

    234

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + 2lg n · T(n/2lg n) (lg n)

    235

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + n · T(n/n) (lg n)

    236

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + n · T(1) (lg n)

    237

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + n (lg n)

    238

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = n + 2T(n/2)

    T(n) = n

    + n (1)

    + n (2)

    + n (3)

    ......

    + n (lg n)

    T(n) = n lg n + n

    239

  • 240

    VerifikasjonMed substitusjon/induksjon

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    241

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    242

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    243

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    = 2

    3

    n

    2lg

    n

    2+

    n

    2

    4

    + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    244

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    = 2

    3

    n

    2lg

    n

    2+

    n

    2

    4

    + n

    = n lgn

    2+ n + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    245

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    = 2

    3

    n

    2lg

    n

    2+

    n

    2

    4

    + n

    = n lgn

    2+ n + n

    = n(lg n − lg 2) + 2n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    246

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    = 2

    3

    n

    2lg

    n

    2+

    n

    2

    4

    + n

    = n lgn

    2+ n + n

    = n(lg n − lg 2) + 2n

    = n lg n + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    247

  • mlh@

    ntnu.no

    d&c › merge sort › T(n) = 2T(n/2) + n

    T(n) = 2T(n/2) + n

    = 2

    3

    n

    2lg

    n

    2+

    n

    2

    4

    + n

    = n lgn

    2+ n + n

    = n(lg n − lg 2) + 2n

    = n lg n + n

    Gitt T(k) = k lg k + k for k < n, vis T(n) = n lg n + n

    248

  • d&c › merge sort › T(n) = 2T(n/2) + n

    T(n/2)

    mlh@

    ntnu.no

    249

  • d&c › merge sort › T(n) = 2T(n/2) + n

    T(n/2)

    T(n) = n lg n + n

    mlh@

    ntnu.no

    250

    Det er lg(n) + 1 rader, og summen av arbeidet i hver rad er n.

  • Downloaded from

    4:6

    Quic

    kso

    rt

    251

    Fra

    196

    2

  • • Skill «små» og «store» tall

    • Sortér små tall rekursivt

    • Sortér store tall rekursivt

    252

  • • Skill «små» og «store» tall

    • Sortér små tall rekursivt

    • Sortér store tall rekursivt

    253

  • Partition(A, p, r)

    Del to segmenter: Ett med små og ett med store verdier

    A tabellp venstrer høyre

    d&c › quicksort

    mlh@

    ntnu.no

    254

  • Partition(A, p, r)

    Splittelement (pivot): Vilkårlig grense for hva vi kaller smått

    1 x = A[r]

    A tabellp venstrer høyrex splitt

    d&c › quicksort

    mlh@

    ntnu.no

    255

  • Partition(A, p, r)1 x = A[r]

    Siste indeks i segmentet med små verdier. Foreløpig tomt

    2 i = p − 1

    A tabellp venstrer høyrex splitti siste, små

    d&c › quicksort

    mlh@

    ntnu.no

    256

  • Partition(A, p, r)1 x = A[r]2 i = p − 1

    Siste indeks i segmentet med store verdier

    3 for j = p to r − 1

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    257

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 1

    A[j] er liten: Må flyttes til segmentet med små verdier

    4 if A[j] ≤ x

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    258

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x

    Utvid segmentet med små verdier. A[i] foreløpig stor

    5 i = i + 1

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    259

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 1

    Både A[i] og A[j] er i feil segment, så de bytter plass

    6 exchange A[i] with A[j]

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    260

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]

    Splittelementet er nå på riktig (sortert) plass, mellom segmentene

    7 exchange A[i + 1] with A[r]

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    261

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]

    Returnér hvor splitten havnet

    8 return i + 1

    A tabellp venstrer høyrex splitti siste, småj siste, store

    d&c › quicksort

    mlh@

    ntnu.no

    262

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    p

    r

    x, i = −, −

    d&c › quicksort

    mlh@

    ntnu.no

    263

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    p

    r

    x, i = 4, −

    d&c › quicksort

    mlh@

    ntnu.no

    264

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    p

    r

    x, i = 4, 0

    d&c › quicksort

    mlh@

    ntnu.no

    265

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    j, p

    r

    x, i = 4, 0

    d&c › quicksort

    mlh@

    ntnu.no

    266

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    j, p

    r

    x, i = 4, 0

    d&c › quicksort

    mlh@

    ntnu.no

    267

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, j, p

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    268

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, j, p

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    269

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    270

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    271

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    272

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    273

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    274

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    i, p

    j

    r

    x, i = 4, 1

    d&c › quicksort

    mlh@

    ntnu.no

    275

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    8 2

    7 3

    1 4

    3 5

    5 6

    6 7

    4 8

    p

    i

    j

    r

    x, i = 4, 2

    d&c › quicksort

    mlh@

    ntnu.no

    276

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    1 2

    7 3

    8 4

    3 5

    5 6

    6 7

    4 8

    p

    i

    j

    r

    x, i = 4, 2

    d&c › quicksort

    mlh@

    ntnu.no

    277

    . . .

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    1 2

    3 3

    8 4

    7 5

    5 6

    6 7

    4 8

    p

    i

    j

    r

    x, i = 4, 3

    d&c › quicksort

    mlh@

    ntnu.no

    278

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    2 1

    1 2

    3 3

    4 4

    7 5

    5 6

    6 7

    8 8

    p

    i

    j

    r

    x, i = 4, 3

    d&c › quicksort

    mlh@

    ntnu.no

    279

  • Partition(A, p, r)1 x = A[r]2 i = p − 13 for j = p to r − 14 if A[j] ≤ x5 i = i + 16 exchange A[i] with A[j]7 exchange A[i + 1] with A[r]8 return i + 1

    ! 4

    2 1

    1 2

    3 3

    4 4

    7 5

    5 6

    6 7

    8 8

    p

    i

    j

    r

    x, i = 4, 3

    d&c › quicksort

    mlh@

    ntnu.no

    280

  • • Skill «små» og «store» tall

    • Sortér små tall rekursivt

    • Sortér store tall rekursivt

    281

  • • Skill «små» og «store» tall

    • Sortér små tall rekursivt

    • Sortér store tall rekursivt

    282

  • d&c › quicksort

    Quicksort(A, p, r)

    Sortér A[p . . r] ved å sortere små og store verdier hver for seg

    mlh@

    ntnu.no

    283

  • d&c › quicksort

    Quicksort(A, p, r)

    Hvis A[p . . r] har lengde minst 2 . . .

    1 if p < r

    mlh@

    ntnu.no

    284

  • d&c › quicksort

    Quicksort(A, p, r)1 if p < r

    A[p . . q − 1] ≤ A[q] ≤ A[q + 1 . . r]. Merk at A[q] er på rett plass

    2 q = Partition(A, p, r)

    mlh@

    ntnu.no

    285

  • d&c › quicksort

    Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)

    Sortér små verdier A[p . . q − 1] rekursivt

    3 Quicksort(A, p, q − 1)

    mlh@

    ntnu.no

    286

  • d&c › quicksort

    Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)

    Sortér store verdier A[q + 1 . . r] rekursivt

    4 Quicksort(A, q + 1, r)

    mlh@

    ntnu.no

    287

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    5 1

    2 2

    4 3

    7 4

    1 5

    3 6

    2 7

    6 8

    p

    r

    p, q, r = 1, −, 8

    d&c › quicksort

    mlh@

    ntnu.no

    288

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    5 1

    2 2

    4 3

    7 4

    1 5

    3 6

    2 7

    6 8

    p

    r

    p, q, r = 1, −, 8

    d&c › quicksort

    mlh@

    ntnu.no

    289

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    5 1

    2 2

    4 3

    1 4

    3 5

    2 6

    6 7

    7 8

    p

    q

    r

    p, q, r = 1, 7, 8

    d&c › quicksort

    mlh@

    ntnu.no

    290

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    5 1

    2 2

    4 3

    1 4

    3 5

    2 6

    6 7

    7 8

    p

    r

    p, q, r = 1, 7, 8 › 1, −, 6

    d&c › quicksort

    mlh@

    ntnu.no

    291

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    5 1

    2 2

    4 3

    1 4

    3 5

    2 6

    6 7

    7 8

    p

    r

    p, q, r = 1, 7, 8 › 1, −, 6

    d&c › quicksort

    mlh@

    ntnu.no

    292

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    2 1

    1 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p

    q

    r

    p, q, r = 1, 7, 8 › 1, 3, 6

    d&c › quicksort

    mlh@

    ntnu.no

    293

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    2 1

    1 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p

    r

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, −, 2

    d&c › quicksort

    mlh@

    ntnu.no

    294

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    2 1

    1 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p

    r

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, −, 2

    d&c › quicksort

    mlh@

    ntnu.no

    295

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    1 1

    2 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p, q

    r

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2

    d&c › quicksort

    mlh@

    ntnu.no

    296

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    1 1

    2 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2 › 1, −, 0

    d&c › quicksort

    mlh@

    ntnu.no

    297

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    1 1

    2 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2 › 1, −, 0

    d&c › quicksort

    mlh@

    ntnu.no

    298

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    1 1

    2 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p, q

    r

    p, q, r = 1, 7, 8 › 1, 3, 6 › 1, 1, 2

    d&c › quicksort

    mlh@

    ntnu.no

    299

  • Quicksort(A, p, r)1 if p < r2 q = Partition(A, p, r)3 Quicksort(A, p, q − 1)4 Quicksort(A, q + 1, r)

    1 1

    2 2

    2 3

    5 4

    3 5

    4 6

    6 7

    7 8

    p, r

    p, q, r = 1, 7, 8 › 1,