2.2 Effektive sorteringer og nedre grense
Merge, Heap og Quick sort som O(n log n)-sorteringer (Quick O(n²) verste) — hva de brukes til på Del 2 (sortér-så-skann), ikke håndkjøring.
De tre effektive sorteringene testes på to måter, og begge har vært på alle
sju settene (100 %).
Sjanger D — sorteringsegenskaper og valg (sant/usant om stabilitet, in-place
og kjøretid) og sjanger C — kjøretids- og teorifakta (rene faktapåstander)
plukker begge fra den samme tabellen. Det klart hyppigste enkeltpunktet er
kvikksorteringens verste tilfelle: , ikke .
Den andre bruken er viktigere for karakteren. På Del 2 — der du skriver
pseudokode — er «sortér i og skann i » en helt lovlig
strategi når ingen lineær løsning finnes. Da må du kunne si hvilken sortering du
bruker og hva den koster. Det er nettopp dette som gjør kapitlet til mer enn
puggestoff.
Du blir ikke bedt om å håndkjøre flettesortering eller kvikksortering på
eksamen — heapstrukturen håndkjøres derimot, og den bygges opp i Del 4. Her
handler det om egenskaper, kjøretid og valg.
Prioritet: høyeste. Tabellen nederst i kapitlet er ren poengvaluta på Del 1.
Slik er kapitlet lagt opp (50 min): fire løkker med tidsanslag og et
pausepunkt underveis.
Forkunnskaper
- kap. 2.1 — stabilitet, in-place og de tre invariantene.
Alle begrepene brukes videre her uten ny forklaring.
- kap. 1.2 — løkketelling. Kjøretidene under regnes ut ved
å telle nivåer og arbeid per nivå, som er den samme tellingen.
- kap. 1.1 — , og forskjellen mellom verste og
forventet tilfelle.
Vil du se boblesortering kjøre som ekte kode først:
Sortering: boblesortering, .sort() og gitt sort_list.
Løkke 1 — flettesortering og nivåtellingen (ca. 14 min)
Tenk deg to bunker med søknader, hver allerede sortert på dato. Å slå dem sammen
til én sortert bunke er lett: se på det øverste arket i hver bunke, ta det
eldste, gjenta. Du går gjennom hvert ark nøyaktig én gang.
Det er hele ideen bak flettesortering (merge sort). Del arrayet i to,
sortér hver halvdel — med samme metode — og flett de to sorterte halvdelene
sammen.
Det avgjørende for kjøretiden er ikke rekursjonen i seg selv, men hvor mange
ganger et array på elementer kan halveres før bitene har ett element. Det
er ganger. Og på hvert nivå gjør flettingen til sammen
arbeid, fordi hvert element passerer gjennom nøyaktig én fletting per nivå.
nivåer, arbeid per nivå. Det gir . Legg merke til
at dette er ren telling — vi setter ikke opp noen ligning.
Splitter arrayet i to halvdeler, sorterer hver halvdel rekursivt og fletter de
to sorterte halvdelene sammen.
i alle tilfeller — beste, forventet og verste. Stabil, men
ikke in-place: flettingen trenger et hjelpearray på plasser.
Den brukes som referansealgoritme fordi den er den eneste av de tre effektive som
kombinerer garantert med stabilitet.
A er et array med sammenlignbareelementer indeksert fra 0. Vi har lov til å opprette nye arrayer.
Prebetingelse: A inneholder elementer i vilkårlig rekkefølge.
Postbetingelse: returverdien er et nytt array med de samme elementene, sortert
stigende.
Procedure MergeSort(A)
Input: array A med n sammenlignbare elementer, indeksert fra 0
Output: et sortert array med de samme elementene
if A.length <= 1:
return A
m = A.length / 2
venstre = MergeSort(A[0 .. m-1])
hoyre = MergeSort(A[m .. A.length-1])
return Merge(venstre, hoyre)Flettingen er den delen som gjør arbeidet, og den er verdt å kunne skrive:
Procedure Merge(V, H)
Input: to sorterte arrayer V og H
Output: ett sortert array med alle elementene fra V og H
ut = tomt array
i = 0
j = 0
while i < V.length and j < H.length:
if V[i] <= H[j]:
legg V[i] bakerst i ut
i = i + 1
else:
legg H[j] bakerst i ut
j = j + 1
legg resten av V (fra i) bakerst i ut
legg resten av H (fra j) bakerst i ut
return utGrunnideen i én setning: to sorterte biter kan flettes ved å alltid ta det
minste av de to første elementene, fordi det ikke kan finnes noe mindre lenger
bak i en sortert bit.
Kjøretid: Merge går gjennom hvert element én gang, altså for samlet
lengde . Splittingen gir nivåer, og på hvert nivå flettes til
sammen elementer. Totalt , i alle tilfeller.
Stabiliteten ligger i ett tegn: V[i] <= H[j]. Fordi venstre vinner ved
likhet, beholder like elementer sin innbyrdes rekkefølge. Bytter du til <,
slutter flettesortering å være stabil.
Kjør MergeSort på A = [8, 3, 5, 1, 9, 2]. Vis splittefasen og flettefasen,
og tell antall sammenligninger.
| Nivå | Biter |
|---|---|
| 0 | [8, 3, 5, 1, 9, 2] |
| 1 | [8, 3, 5] [1, 9, 2] |
| 2 | [8] [3, 5] [1] [9, 2] |
| 3 | [3] [5] [9] [2] |
Flettefasen — nedenfra og opp:
| Nivå | Venstre | Høyre | Flettet | Sammenligninger |
|---|---|---|---|---|
| 2 | [3] | [5] | [3, 5] | 1 |
| 2 | [9] | [2] | [2, 9] | 1 |
| 1 | [8] | [3, 5] | [3, 5, 8] | 2 |
| 1 | [1] | [2, 9] | [1, 2, 9] | 1 |
| 0 | [3, 5, 8] | [1, 2, 9] | [1, 2, 3, 5, 8, 9] | 5 |
Sluttilstand:
[1, 2, 3, 5, 8, 9]. I alt 10 sammenligninger.Sammenlign med kap. 2.1: de kvadratiske sorteringene
brukte 12 til 15 sammenligninger på nøyaktig det samme arrayet. Med seks
elementer er forskjellen liten. Med en million elementer er den ca. 20 millioner
mot ca. 500 milliarder.
Kontrollregning av nivåtellingen. Arrayet har 6 elementer, og
ligger mellom 2 og 3 — vi fikk tre flettenivåer, som stemmer. På hvert nivå ble
det flettet til sammen 6 elementer eller færre. Så er et tak,
og vi brukte 10 sammenligninger. Det er nettopp .
Merk hjelpearrayet. Merge bygger et nytt ut-array. Det er derfor
flettesortering ikke er in-place, og det er et fast sant/usant-punkt.
(Innstegsoppgave, sjanger C — kjøretids- og teorifakta, altså rene
sant/usant-påstander om algoritmer.) Avgjør sant eller usant.
a) Flettesortering er også i verste tilfelle.
b) Flettesortering er in-place.
c) Flettesortering er stabil.
Løkke 2 — heapsort, kort og presist (ca. 8 min)
Heapsort får en kort omtale her og full behandling i Del 4, der selve
heap-strukturen bygges og håndkjøres. Det du trenger for Del 1 nå, er de tre
linjene i tabellen.
Ideen: gjør arrayet om til en heap — en struktur der du alltid kan plukke ut
det minste elementet raskt — og plukk deretter ut elementene ett for ett.
Uttrekket koster og gjøres ganger, altså .
Ett tall her er lett å bomme på, og det er et fast sant/usant-punkt: å bygge
heapen fra et vilkårlig array koster , ikke . Det er selve
uttrekksfasen som koster logaritmisk per element.
Bygger en heap av arrayet og henter ut det minste elementet gjentatte ganger til
heapen er tom.
i alle tilfeller. In-place — heapen ligger i selve arrayet
— men ikke stabil, fordi uttrekket flytter elementer over lang avstand.
Strukturen og håndkjøringen hører hjemme i Del 4; her trengs bare kjøretiden og
de to egenskapene.
BuildHeap gjør et vilkårlig array om til en heap i — ikke.
Grunnen er at de fleste nodene ligger nær bunnen og derfor har kort vei å synke.
Dette er en fast distraktor på sant/usant: påstanden «å bygge en heap fra et
vilkårlig array tar » er usann. Selve heapsorteringen er
likevel, fordi de uttrekkene koster hver.
Løkke 3 — kvikksortering og de to kjøretidene (ca. 14 min)
— naturlig pausepunkt —
Kvikksortering (quicksort) angriper problemet fra motsatt kant av
flettesortering. Der flettesortering deler blindt på midten og gjør arbeidet i
flettingen, gjør kvikksortering alt arbeidet i delingen — og trenger ingen
fletting i det hele tatt.
Metoden heter partisjonering: velg ett element som pivot, og still om
arrayet slik at alt som er mindre enn pivoten havner til venstre for den, og alt
som er større havner til høyre. Da står pivoten på sin endelige plass, og du kan
sortere de to sidene hver for seg.
Her ligger både styrken og svakheten. Deler pivoten omtrent på midten hver gang,
får du nivåer og . Havner pivoten ytterst hver gang,
skreller du av bare ett element per nivå — og da får du nivåer og .
Velger et pivotelement, partisjonerer arrayet slik at alt mindre står til
venstre for pivoten og alt større til høyre, og sorterer så hver side rekursivt.
forventet, i verste tilfelle. In-place og
ikke stabil.
Verste tilfelle inntreffer når pivoten systematisk havner ytterst — for eksempel
hvis du alltid velger siste element og arrayet allerede er sortert. Påstanden
«kvikksortering er i verste tilfelle» er usann, og den er
kapitlets hyppigste distraktor.
Elementet en partisjonering deler om. Alt mindre enn pivoten legges til venstre
for den, alt større til høyre, og pivoten står deretter på sin endelige plass.
Valget av pivot avgjør kvikksorteringens kjøretid. Siste element er det enkleste
valget, men gir på allerede sorterte data. Et tilfeldig valgt element,
eller medianen av tre, gjør verste tilfelle usannsynlig — men fjerner det ikke.
A er et array indeksert fra 0. Vipartisjonerer delen fra indeks
lav til og med høy, og bruker A[høy] sompivot. Sorteringen skjer på stedet.
Prebetingelse: lav <= høy. Postbetingelse: pivoten står på indeksen som
returneres; alt til venstre for den er mindre, alt til høyre er større eller lik.
Procedure Partition(A, lav, hoy)
Input: array A, og indeksene lav og hoy som avgrenser biten
Output: indeksen der pivoten A[hoy] havnet, med alt mindre til venstre
pivot = A[hoy]
i = lav
for j = lav to hoy-1:
if A[j] < pivot:
bytt A[i] og A[j]
i = i + 1
bytt A[i] og A[hoy]
return iSelve sorteringen er da tre linjer:
Procedure QuickSort(A, lav, hoy)
Input: array A og indeksene lav og hoy
Output: A[lav..hoy] sortert stigende, sortert på stedet
if lav < hoy:
p = Partition(A, lav, hoy)
QuickSort(A, lav, p-1)
QuickSort(A, p+1, hoy)Invarianten i én setning: rett før hver runde av for-løkka er alt iA[lav..i-1] mindre enn pivoten, og alt i A[i..j-1] er større eller lik.
Kjøretid: én partisjonering av en bit med elementer koster
sammenligninger, altså . Deler pivoten omtrent på midten, blir det
nivåer med arbeid hver — . Havner pivoten ytterst
hver gang, blir det nivåer med sammenligninger, altså
— .
Partisjonér A = [7, 2, 9, 4, 1, 6] med A[høy] = 6 som pivot. Vis hvert steg
av for-løkka, og oppgi hvor pivoten havner.
j | A[j] før | A[j] < 6? | Handling | Array etter | i etter |
|---|---|---|---|---|---|
| 0 | 7 | nei | la stå | [7, 2, 9, 4, 1, 6] | 0 |
| 1 | 2 | ja | bytt plass 0 og 1 | [2, 7, 9, 4, 1, 6] | 1 |
| 2 | 9 | nei | la stå | [2, 7, 9, 4, 1, 6] | 1 |
| 3 | 4 | ja | bytt plass 1 og 3 | [2, 4, 9, 7, 1, 6] | 2 |
| 4 | 1 | ja | bytt plass 2 og 4 | [2, 4, 1, 7, 9, 6] | 3 |
| — | — | — | bytt pivoten inn på plass 3 | [2, 4, 1, 6, 9, 7] | 3 |
Sluttilstand:
[2, 4, 1, 6, 9, 7]. Pivoten 6 står nå endelig på indeks 3.Venstre del er
[2, 4, 1], høyre del er [9, 7]. Partisjoneringen brukte 5sammenligninger, altså .
Legg merke til to ting.
For det første: venstre og høyre del er ikke sortert. Partisjonering
garanterer bare at alle til venstre er mindre enn pivoten. Sorteringen skjer når
QuickSort kalles rekursivt på hver side.For det andre: pivoten 6 havnet nesten midt i arrayet, som er heldig. Delingen
ble 3 mot 2, og da får vi det gode tilfellet. Neste eksempel viser det motsatte.
Om stabiliteten. Byttet bytt A[i] og A[j] flytter et element over lang
avstand — akkurat som i utvalgssortering, og med samme konsekvens.
Kvikksortering er ustabil.
Partisjonér A = [3, 8, 5, 2, 7] med siste element som pivot.
a) Hvilken indeks havner pivoten på?
b) Hvordan ser arrayet ut rett etter partisjoneringen?
c) Hvor mange sammenligninger brukte partisjoneringen?
Hvorfor blir kvikksortering med siste element som pivot på et array som
allerede er sortert? Vis regnestykket for .
Partisjonér A = [1, 2, 3, 4, 5] med A[høy] = 5 som pivot:
j | A[j] før | A[j] < 5? | Handling | Array etter | i etter |
|---|---|---|---|---|---|
| 0 | 1 | ja | bytt plass 0 og 0 | [1, 2, 3, 4, 5] | 1 |
| 1 | 2 | ja | bytt plass 1 og 1 | [1, 2, 3, 4, 5] | 2 |
| 2 | 3 | ja | bytt plass 2 og 2 | [1, 2, 3, 4, 5] | 3 |
| 3 | 4 | ja | bytt plass 3 og 3 | [1, 2, 3, 4, 5] | 4 |
| — | — | — | bytt pivoten inn på plass 4 | [1, 2, 3, 4, 5] | 4 |
Pivoten havnet helt til høyre. Venstre del har fire elementer, høyre del er
tom. Neste kall får altså bare ett element færre, ikke halvparten.
Nivåtellingen for :
| Nivå | Største bit | Arbeid på nivået |
|---|---|---|
| 0 | 8 | 7 sammenligninger |
| 1 | 7 | 6 sammenligninger |
| 2 | 6 | 5 sammenligninger |
| 3 | 5 | 4 sammenligninger |
| 4 | 4 | 3 sammenligninger |
| 5 | 3 | 2 sammenligninger |
| 6 | 2 | 1 sammenligning |
Sju nivåer, og summen er sammenligninger. Det er
med — trekantsummen fra
kap. 1.2, altså .
Sammenlign med flettesortering på samme : fire nivåer med 8 elementer
hver, altså høyst 32 elementbevegelser, men bare tre flettenivåer med reelt
arbeid. For er forskjellen liten. For er den forskjellen
mellom sekunder og dager.
Dette er kapitlets viktigste enkeltfaktum. Kvikksortering er
forventet og verste. Skriver du bare «» uten å
nevne hvilket tilfelle, er svaret ufullstendig.
Avgjør sant eller usant, og begrunn hver med én setning.
a) Kvikksortering har i verste tilfelle.
b) Heapsort er stabil.
c) Flettesortering trenger ekstra minne.
d) Å bygge en heap fra et vilkårlig array tar .
Løkke 4 — nedre grensen, tegnet ut (ca. 14 min)
Nå kan vi gjøre ferdig det kap. 2.1 bare skisserte: hvorfor
ikke bare er bra, men optimalt for en sammenligningsbasert
sortering.
Tenk på algoritmen som en person som skal gjette hvilken av rekkefølgene input
har, og som bare får stille ja/nei-spørsmål av typen «er mindre enn ?».
Hvert spørsmål deler mulighetene i to. Alle mulige spørsmålsrekker danner til
sammen et beslutningstre: en node per spørsmål, to grener ut, og ett blad per
mulig sluttrekkefølge.
En modell av en sammenligningsbasert sortering: hver indre node er én
sammenligning, hver gren er svaret (ja eller nei), og hvert blad er én mulig
sluttrekkefølge.
Antall sammenligninger i verste tilfelle er høyden på treet — den lengste
veien fra rot til blad. Treet må ha minst blader for å kunne skille alle
rekkefølger, og et binærtre med blader har høyde minst .
sammenligninger i verste tilfelle.
Bevisskissen, i fire steg — dette er den formen sensor ber om:
1. Tell mulighetene. ulike elementer kan stå i ulike rekkefølger.
Algoritmen må kunne ende opp med hver av dem, avhengig av input.
2. Tell informasjonen. Hver sammenligning gir ett ja/nei-svar. Med
sammenligninger finnes det høyst ulike svarsekvenser, altså høyst
ulike blader.
3. Sett dem opp mot hverandre. For å skille alle rekkefølger må
, altså .
4. Forenkl. vokser som . En rask måte å se det på: mer
enn halvparten av faktorene i er større enn , så
, og logaritmen av det er ,
som er .
Hva grensen gjelder. Verste tilfelle, og bare for algoritmer som kun
sammenligner. Beste tilfelle kan godt være — innsettingssortering på et
ferdigsortert array bruker sammenligninger.
Hva grensen ikke gjelder. Algoritmer som ser på verdiene i stedet for å
sammenligne dem. Counting sort, radix sort og bucket sort i
kap. 2.3 kommer under grensen nettopp fordi de ikke er
sammenligningsbaserte. De betaler for det med en antagelse om verdiområdet.
Tegn ut beslutningstreet for å sortere tre ulike elementer , og , og
sjekk at høyden stemmer med formelen.
Med tre elementer finnes det mulige rekkefølger, altså seks blader.
Her er alle veiene gjennom treet, med den beste spørsmålsstrategien:
| Blad | Sluttrekkefølge | Sammenligninger på veien | Antall |
|---|---|---|---|
| 1 | ? ja; ? ja; ? ja | 3 | |
| 2 | ? ja; ? ja; ? nei | 3 | |
| 3 | ? ja; ? nei | 2 | |
| 4 | ? nei; ? ja | 2 | |
| 5 | ? nei; ? nei; ? ja | 3 | |
| 6 | ? nei; ? nei; ? nei | 3 |
Seks blader, største dybde 3.
Kontroll mot formelen. Nedre grensen sier at høyden må være minst
, og siden antall sammenligninger er et
helt tall, minst 3. Treet vårt har høyde nøyaktig 3 — grensen er altså stram
her.
Legg merke til bladene 3 og 4. De nås med bare to sammenligninger. Nedre
grensen sier ikke at hver input krever tre sammenligninger, bare at den
verste
gjør det. Det er nettopp derfor grensen gjelder verste tilfelle og ikkebeste.
Prøv formen hvis dette kommer som en Del 2-oppgave: «Det finnes mulige
rekkefølger. Hver sammenligning gir ett bit, så sammenligninger skiller høyst
tilfeller. Da må , altså .»
Tre setninger, og alle de tre momentene sensor teller er med.
Nedre grensen sier .
a) Hvor mange sammenligninger trenger et beslutningstre minst for å sortere
4 ulike elementer?
b) Motsier det nedre grensen at innsettingssortering bruker
sammenligninger på et ferdigsortert array?
c) Motsier det nedre grensen at counting sort kan sortere i ?
Kjøretidstabellen for alle sju sorteringene
Dette er bokas viktigste puggeflate for Del 1. De tre øverste er fra
kap. 2.1, de tre neste er dette kapitlet, og counting sort
kommer i kap. 2.3.
| Algoritme | Beste | Verste | Forventet | Stabil? | In-place? |
|---|---|---|---|---|---|
| Boblesortering | med tidlig stopp | ja | ja | ||
| Utvalgssortering | nei | ja | |||
| Innsettingssortering | ja | ja | |||
| Flettesortering | ja | nei | |||
| Heapsort | nei | ja | |||
| Kvikksortering | nei | ja | |||
| Counting sort | ja | nei |
Tre observasjoner som dekker de fleste sant/usant-punktene:
1. Bare kvikksortering har ulikt verste og forventet tilfelle blant de tre
effektive. Det er derfor den er den hyppigste distraktoren.
2. Bare flettesortering er både garantert og stabil — og prisen
er at den ikke er in-place.
3. Counting sort er den eneste under , og den er der bare fordi den
ikke sammenligner. Merk : den er lineær i , ikke i alene.
Del 2-bruken: «sortér og skann»
Dette er grunnen til at kapitlet betyr noe utover Del 1.
På en Del 2-oppgave — der du skal skrive pseudokode og oppgi kjøretid — dukker
det stadig opp problemer av typen «finnes det to like elementer?» eller «finnes
det to elementer som summerer til ?». På et usortert array har du to
lovlige veier:
- Sortér i og skann i . Totalt .
- Bruk et hash-set i forventet. Se
kap. 3.2 og kap. 3.4.
Begge er riktige. Men de gir ulikt antall poeng, fordi sensorveiledningene er
eksplisitte på at lavere kjøretid er mer poenggivende — den regelen kalles
poengtrappen i denne boka. Den lineære løsningen står øverst.
To ting du ikke kan gjøre, og som begge gir trekk:
- Bruke bucket sort eller radix sort som «raskere sortering» når alt du vet er at
elementene kan sammenlignes. De krever et kjent, begrenset verdiområde — se
kap. 2.3.
- Skrive uten å si hvilken sortering du bruker. Kjøretiden må matche
algoritmen du faktisk oppga.
Fem dokumenterte poengtap, i synkende rekkefølge etter hvor ofte de dukker opp.
- Å oppgi som kvikksorteringens verste tilfelle. Verste er
; er forventet. Skriv alltid hvilket tilfelle du snakker
om.
- Å tro at flettesortering er in-place. Den trenger ekstra minne til
flettingen. Dette er den vanligste feilen om flettesortering.
- Å tro at heapsort er stabil. Den er in-place, men ikke stabil — de to
egenskapene forveksles fordi de nevnes sammen.
- Å påstå at BuildHeap er . Den er . Selve
heapsorteringen er , og det er den blandingen som skaper feilen.
- Å bruke uten å definere det. Felle #10 i bokas feilregister — å
oppgi kjøretid eller drøfte uten å si hva problemstørrelsen er. Én setning
holder.
Og én til, som gjelder Del 2: å foreslå bucket eller radix på generelle
sammenlignbare elementer. Det er felle #5 — lineær sortering brukt uten at
forutsetningen om et kjent, begrenset verdiområde er oppfylt.
Velg sortering for hver situasjon, og oppgi
kjøretiden.
a) 2 millioner poster som skal sorteres på dato, og rekkefølgen mellom poster
med samme dato må bevares.
b) Et innebygd system med svært lite minne, der ekstra arrayer ikke er mulig,
men kjøretiden må være garantert .
c) Generell sortering av tall der du bare bryr deg om forventet ytelse, og
minnebruken skal være lav.
Et array på elementer er allerede sortert.
a) Hva er kjøretiden til flettesortering på det?
b) Hva er kjøretiden til kvikksortering med siste element som pivot?
c) Hva er kjøretiden til heapsort?
d) Hva sier dette om påstanden «effektive sorteringer er alltid raskere enn
kvadratiske»?
Du får et usortert array A med
heltall og skal avgjøre om det finnes to like elementer.
a) Skriv en løsning som bruker sortering. Oppgi antagelser og kjøretid.
b) En medstudent foreslår å bruke radix sort «fordi den er lineær». Hva er
problemet?
c) Hva er det høyeste trinnet i poengtrappen på denne oppgaven?
Avgjør sant eller usant, og begrunn.
a) Hvis en sortering er i verste tilfelle, kan den ikke være
sammenligningsbasert.
b) Nedre grensen gjelder også for counting sort.
c) En sammenligningsbasert sortering kan avgjøre om et array allerede er
sortert i .
d) Kvikksortering kan gjøres til i verste tilfelle ved å velge
pivoten tilfeldig.
Begrepsbank
Begrepsbanken er flashcard-/repetisjonsstoff — den gjentar det du nettopp har
lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet gjelder
kjernestoffet.
Operasjonen som slår to ferdig sorterte arrayer sammen til ett sortert array
ved gjentatte ganger å ta det minste av de to første elementene.
der er samlet lengde: hvert element flyttes nøyaktig én gang.
Flettingen er stabil hvis venstre bit vinner ved likhet — det er hele
begrunnelsen for at flettesortering er stabil.
Fagets måte å analysere en algoritme som deler problemet opp: tell hvor mange
nivåer delingen gir, og hvor mye arbeid som gjøres på hvert nivå. Gang sammen.
Flettesortering: nivåer, per nivå, altså .
Kvikksortering i verste tilfelle: nivåer med avtakende arbeid, altså
. Metoden erstatter rekurrensligninger, som ikke er IN2010-pensum.
Å stille om en del av arrayet slik at alt som er mindre enn pivoten står til
venstre for den og alt større til høyre. Pivoten står deretter på sin endelige
plass.
sammenligninger for en bit med elementer — én per element unntatt
pivoten. Delene er ikke sortert etterpå; det skjer i de rekursive kallene.
når siste element velges som pivot på et allerede sortert array.
Dette er bokas hyppigste sant/usant-distraktor. Påstanden «kvikksortering er
i verste tilfelle» er usann.
algoritmen gjør). Verste er det dårligste som kan skje.
Kvikksortering er den eneste av de sju sorteringene der de to er forskjellige:
forventet, verste. Oppgaveteksten sier alltid hvilken av
de to den spør om.
Å velge pivoten tilfeldig i stedet for alltid å ta siste element. Gjør verste
tilfelle usannsynlig, men ikke umulig.
Forventet kjøretid blir for enhver input, og det er en reell
forbedring. Verste tilfelle er fortsatt — den nyansen er en fast
distraktor.
Merge bygger et nytt array, så flettesortering bruker ekstra minne.Det er den eneste av de sju sorteringene der stabilitet og garantert
kommer sammen — og minnebruken er prisen. Heapsort er in-place, men
ustabil; kvikksortering er in-place, men har verste.
Heapen ligger i selve arrayet, så heapsort bruker ekstra minne. Uttrekket
flytter derimot elementer over lang avstand, så algoritmen er ikke stabil.
Kombinasjonen «in-place og garantert » er unik for heapsort, og det
er nettopp den kombinasjonen som gjør den til riktig svar når minnet er knapt og
garantien kreves.
nivåer, uansett hvilke tall arrayet inneholder.
Det er dette som gjør flettesortering til referansealgoritmen i faget: den har
verken en god eller en dårlig dag, og kjøretiden kan siteres uten forbehold.
Del 2-mønsteret: står du med et usortert array og trenger en egenskap som er lett
å se i sortert rekkefølge, sortér i og skann i . Totalt
.
Fullt lovlig og gir god uttelling — men står ett trinn under den lineære
hash-baserte løsningen i poengtrappen. Se
kap. 3.4.
Sensorveiledningene sier eksplisitt at lavere kjøretid er mer poenggivende på
samme oppgave. På et duplikatsøk gir forventet med hash-set full pott,
med sortering noe mindre, og en dobbelt løkke på minst.
Alle tre er korrekte løsninger. Å velge riktig algoritme er å velge poeng.
Antall sammenligninger en sammenligningsbasert sortering bruker i verste
tilfelle er høyden på beslutningstreet — den lengste veien fra rot til blad.
Med blader er høyden minst . For gir det minst 3
sammenligninger, for minst 5.
algoritmer.
Derfor motsier verken innsettingssorteringens i beste tilfelle, counting
sorts , eller den lineære sjekken av om et array er sortert, grensen.
Å sitere grensen uten å oppgi rekkevidden er halve svaret.
Del 1-sjangeren der du krysser av sant/usant på rene faktapåstander om
kjøretider, sorteringsegenskaper, heap, hashing og P/NP.
Har vært på 7 av 7 sett (100 %). Kombinert med antigjettings-skaleringen betyr
det at kjøretidstabellen må sitte hjelpemiddelfritt: den som er usikker på
halvparten, ender på null.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.
Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Universitetet i Oslo. Dette er ikke offisielt studiemateriell. Les mer.