Øvingsforelesning 6. Sorteringsalgoritmer. Martin Kirkholt Melhus Basert på foiler av Kristian Veøy 30/09/14 1

Like dokumenter
Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Heapsort. Lars Vidar Magnusson Kapittel 6 Heaps Heapsort Prioritetskøer

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

deeegimnoorrrsstt Sjette forelesning

n/b log b n = (lg n) a log b n = n log b a

INF2220: Time 12 - Sortering

deeegimnoorrrsstt Sjette forelesning

Ekstra ark kan legges ved om nødvendig, men det er meningen at svarene skal få plass i rutene på oppgavearkene. Lange svar teller ikke positivt.

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Sortering i Lineær Tid

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Sorterings- Algoritmer

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Logaritmiske sorteringsalgoritmer

Løsningsforslag for Obligatorisk Oppgave 2. Algoritmer og Datastrukturer ITF20006

Algdat Eksamensforelesning. Nils Barlaug

Hvor raskt klarer vi å sortere?

Quicksort. Lars Vidar Magnusson Kapittel 7 Quicksort Randomisert Quicksort Analyse av Quicksort

Binær heap. En heap er et komplett binært tre:

Øvingsforelesning 4. Martin Aasen

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

INF Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Algdat - øvingsforelesning

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

INF Algoritmer og datastrukturer

Pensum: 3. utg av Cormen et al. Øvingstime: I morgen, 14:15

Innhold. Innledning 1

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Pensum: fra boken (H-03)+ forelesninger

INF2220: Forelesning 2

INF Algoritmer og datastrukturer

Pensum: fra boken (H-03)+ forelesninger

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Prioritetskøer. Prioritetskøer. Binære heaper (vanligst) Prioritetskøer

TDT4105 Informasjonsteknologi, grunnkurs

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

ALGORITMER OG DATASTRUKTURER

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Minimum Spenntrær - Kruskal & Prim

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Python: Rekursjon (og programmering av algoritmer) Python-bok: Kapittel 12 + teoribok om Algoritmer

Eksamen i tdt4120 Algoritmer og datastrukturer

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

LO118D Forelesning 12 (DM)

SIF8010 ALGORITMER OG DATASTRUKTURER

INF1010 notat: Binærsøking og quicksort

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

Løsningsforslag for eksamen i fag SIF8010 Algoritmer og datastrukturer Lørdag 9. august 2003, kl

Avsluttende eksamen i IT1105/TDT4120 Algoritmer og datastrukturer

Datastrukturer. Stakker (Stacks) Hva er en datastruktur? Fordeler / Ulemper. Generelt om Datastrukturer. Stakker (Stacks) Elementære Datastrukturer

Kontinuasjonseksamen i fag SIF8010 Algoritmer og Datastrukturer Torsdag 9. August 2001, kl

INF2220: Time 4 - Heap, Huffmann

INF1020 Algoritmer og datastrukturer. Dagens plan

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing. Børge Rødsjø

Algoritmer og Datastrukturer IAI 21899

UNIVERSITETET I OSLO

Algdat Oppsummering, eksamen-ting. Jim Frode Hoff

Eksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi

LØSNINGSFORSLAG, EKSAMEN I ALGORITMER OG DATASTRUKTURER (IT1105)

Dijkstras algoritme. Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert.

ALGORITMER OG DATASTRUKTURER

Binære Søketre. Egenskap. Egenskap : Grafisk. Egenskap : Kjøretid. Egenskap : Kjøretid. Egenskap : Oppsumering. Binære Søketre

Disjunkte mengder ADT

Algdat - øvingsforelesning

Alg. Dat. Øvingsforelesning 3. Grafer, BFS, DFS og hashing

Løsningsforslag for eksamen i fag TDT4120 Algoritmer og datastrukturer Tirsdag 9. desember 2003, kl

O(V 2 ) bwfs(v, i=1) λ[v] = i for each neighbor u of v if 0 < λ[u] < i. bwfs(u, i+1) if λ[u] = 0

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

... Dagens plan. Prioritetskø ADT

for bare trær Andre forelesning

Eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

UNIVERSITETET I OSLO

INF1020 Algoritmer og datastrukturer

Algoritmer og Datastrukturer

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

Løsnings forslag i java In115, Våren 1996

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Dagens plan: INF Algoritmer og datastrukturer. Eksempel. Binære Relasjoner

Notater til INF2220 Eksamen

INF Algoritmer og datastrukturer

Introduksjon til Algoritmeanalyse

Quicksort. Fra idé til algoritme.

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Grådige algoritmer. Lars Vidar Magnusson Kapittel 16. Aktivitetvelgingsproblemet Huffmankoder

Læringsmål og pensum. Algoritmeeffektivitet

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

EKSAMEN med løsningsforslag

TDT4110 Informasjonsteknologi grunnkurs: Tema: Algoritmer i praksis. Professor Alf Inge Wang

Eksamensoppgave i TDT4120 Algoritmer og datastrukturer

7) Radix-sortering sekvensielt kode og effekten av cache

Uke 5 Disjunkte mengder

Transkript:

Øvingsforelesning 6 Sorteringsalgoritmer Martin Kirkholt Melhus martme@stud.ntnu.no Basert på foiler av Kristian Veøy 30/09/14 1

Agenda l Spørsmål fra øving 4 l Sortering l Presentasjon av øving 6 30/09/14 2

Oppgave 1a Omvendt alfabetisk rekkefølge = [T S R Q P O N M] T: [T] S: [Sà Rà T] Q: [Qà Sà Rà T] P: [Pà Oà Qà Sà Rà T] N: [Nà Pà Oà Qà Sà Rà T] M: [Mà Nà Pà Oà Qà Sà Rà T]

Oppgave 2b Veiforbindelse mellom n øyer; minimer brolengde. Antall noder: V = n Antall kanter: E = n 2 Prims m/ Fibonacci heap O( E + V log V ) à O(n 2 )

Oppgave 3d Dersom kantene I en sammenhengende graf ikke har forskjellige vekter, vil IKKE denne grafen nødvendigvis ha flere minimale spenntrær.

Hva er sortering? l Vi må finne en permutasjon av elementene slik at: l X 1 <= X 2 <= X 3 <=... <= X n-1 <= X n 6 2 4 1 1 3 7 2 1 1 2 2 3 4 6 7 30/09/14 6

Inspirasjon l Hvordan ville du sortert én million 32bits heltall? l http://www.youtube.com/watch? v=k4rri_ntqc8&feature=youtu.be&t=20s

Sorteringsalgoritmer: Sammenligning: l O(n 2 ) l Bubble sort l Insertion sort l Selection sort Uten sammenligning: l O(n) l Counting sort l Radix sort l Bucket sort l O(n lg n) l Heapsort l Merge sort l Quicksort 30/09/14 8

Bubblesort l Sjekker definisjonen av sortert: l X 1 <= X 2 <= X 3 <=... <= X n-1 <= X n l Hvis et usortert par oppdages: X i > X i+1 l Bytt om på de to verdiene. l Gjenta helt til ingen usorterte par oppdages. 30/09/14 9

Eksempel: 6 7 8 9 5 1 2 3 4 6 7 8 9 5 1 2 3 4 6 7 8 9 5 1 2 3 4 6 7 8 9 5 1 2 3 4 6 7 8 5 9 1 2 3 4 30/09/14 10

6 7 8 5 1 9 2 3 4 6 7 8 5 1 2 9 3 4 6 7 8 5 1 2 3 9 4 6 7 8 5 1 2 3 4 9 1 2 3 4 5 6 7 8 9 30/09/14 11

1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 Ferdig! 30/09/14 12

Kjøretid: l I beste tilfelle er input allerede sortert, da oppdages det ingen konflikter og algoritmen bruker Θ(n) tid. l I verste tilfelle er input sortert i motsatt rekkefølge l Element 1 må da flyttes n - 1 plasser, element 2: n - 2 plasser, osv... Θ(n 2 ). 30/09/14 13

Bubblesort: l Fordeler: l Θ(n) på sorterte lister. l Stabil, in-place. l Ulemper: l Generelt treg. l Alltid tregere(evt like rask) som insertion sort.

Kvaliteter ved sorteringsalgoritmer Stabil sortering l Tar vare på like elementers plassering i forhold til hverandre og bruker denne til å sortere elementer som har lik verdi. l Kun nyttig når : l l Man har flere måter å sortere lista på og vil benytte flere samtidig. Kryssord-ordbok: Sortert etter antall bokstaver og alfabetisk Det finnes like verdier Hvis alle ord hadde ulikt antall bokstaver hadde det ikke hatt noe si 30/09/14 15

Første sortering 30/09/14 16

Ustabil, andre sortering 30/09/14 17

Stabil, andre sortering 30/09/14 18

Bubblesort stabilitet: l Bubblesort vil kun bytte to elementer dersom et av dem er større enn det andre. l Dvs. to like elementer kan ikke komme forbi hverandre. 6 7 7 9 5 1 2 3 4

In-place sortering: l Betyr vanligvis at algoritmen kun bytter på to tall av gangen (Alle algoritmene i pensum). l Bruker relativt lite minne ( O(1) i tillegg til selve lista). l Bubblesort: l Bytter alltid på to og to elementer: 6 7 8 9 5 1 2 3 4 30/09/14 20

Insertion sort: l Del input i to deler: l En sortert del. (Først tom) l En usortert. (Alle elementene ligger her i starten) l Så lenge det finnes usorterte elementer: l Sett et usortert element på riktig plass i den sorterte delen. 30/09/14 21

Eksempel: 4 3 2 1 5 9 8 7 6 3 4 2 1 5 9 8 7 6 2 3 4 1 5 9 8 7 6 1 2 3 4 5 9 8 7 6 30/09/14 22

1 2 3 4 5 9 8 7 6 1 2 3 4 5 9 8 7 6 1 2 3 4 5 8 9 7 6 1 2 3 4 5 7 8 9 6 Ferdig! 30/09/14 23

Kjøretid: l I beste tilfelle er listen allerede sortert l Da står neste element alltid på riktig plass, slik at det bare utføres totalt n-1 sammenligniger og ingen bytter l kjøretiden blir Θ(n) l I verste tilfelle er input sortert i motsatt rekkefølge l Da må element 2: flyttes 1 plass, element 3: 2 plasser,..., element n: n-1 plasser l Kjøretiden blir Θ(n^2) 30/09/14 24

Insertion sort: l Fordeler: l Optimal på sortert input. l Rask på nesten sortert input. l Stabil, in-place l Alltid raskere enn (evt. like rask som) Bubblesort. l Ulemper: l Treg på store input da den har worst case Θ(n 2 ) kjøretid.

Selection sort: l Del input i to deler: l En sortert del l En usortert l Så lenge det finnes usorterte elementer: l Finn største element i den usorterte delen, og flytt dette foran i den sorterte delen. 30/09/14 26

Eksempel: 6 7 8 9 5 1 2 3 4 6 7 8 4 5 1 2 3 9 6 7 3 4 5 1 2 8 9 6 2 3 4 5 1 7 8 9 30/09/14 27

1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 Ferdig!

Kjøretid: l Selection sort vil alltid bruke Θ(n 2 ) tid: l Den må alltid gå igjennom alle de usorterte elementene for å finne det største. Deretter må dette flyttes. Dermed vil tiden alltid være lik. l Samtidig vil det kun bli O(n) flyttinger. På maskiner der dette er en dyr operasjon er dette en stor fordel. 30/09/14 29

Selection sort: l Fordeler: l Alltid like rask. l Få skriveoperasjoner. l In-place. l Ulemper: l Alltid like treg. l Ikke stabil (stabil for lenket liste).

Egenskaper: Bubblesort Insertion Sort Selection Sort Stabil For lenket liste. Parallelliserbar In-place 30/09/14 31

Kahoot!

Trestrukturer: Begreper Repetisjon Rot B og C s Foreldre-node R Kanter Noder Subtre A D H Løvnoder B C F G A s venstre barn A s høyre barn Søskennoder

Hva er en Heap? l En heap er et komplett binærtre, l l l der alle nivå er fylt opp, untatt eventuelt det siste, som er fylt opp fra venstre til høyre l For alle noder i en heap gjelder: l l Barna har lavere eller lik verdi(for max-heap) Barna har større eller lik verdi(for min-heap) l En heap brukes til/av blant annet 8 2 16 14 10 8 7 9 4 2 1 4 5 6 7 9 3 3 l l Prioritetskøer Heapsort

Heap : Datastruktur l Representasjon av et binærtre i et array: 8 2 16 14 10 8 7 9 4 2 1 4 5 6 7 9 rot 3 3 1 2 3 4 5 6 7 8 9 16 14 10 8 7 9 3 2 4 Generelle far/barn relasjoner x x x i/2 i 2i 2i+1 x (Heap-egenskapen)

Max-Heapify : O(lg n) l Subrutine som vedlikeholder Heap-egenskapen, l...dvs at barna til roten er mindre enn roten 2 i 16 4 10 14 7 9 8 2 1 4 5 6 7 3 3 Max-Heapify(A,i) l = left(i) r = right(i) if l heap-size[a] and A[l] > A[i] then largest = l else largest = i if r heap-size[a] and A[r] > A[largest] then largest = r if largest i then exchange A[i] A[largest] Max-Heapify(A,largest)

Max-Heapify : O(lg n) l Subrutine som vedlikeholder Heap-egenskapen, l...dvs at barna til roten er mindre enn roten i 2 16 14 10 4 7 9 8 2 1 4 5 6 7 3 3 Max-Heapify(A,i) l = left(i) r = right(i) if l heap-size[a] and A[l] > A[i] then largest = l else largest = i if r heap-size[a] and A[r] > A[largest] then largest = r if largest i then exchange A[i] A[largest] Max-Heapify(A,largest)

Max-Heapify : O(lg n) l Subrutine som vedlikeholder Heap-egenskapen, l...dvs at barna til roten er mindre enn roten 2 16 14 10 8 7 9 4 2 1 4 5 6 7 i 3 3 Max-Heapify(A,i) l = left(i) r = right(i) if l heap-size[a] and A[l] > A[i] then largest = l else largest = i if r heap-size[a] and A[r] > A[largest] then largest = r if largest i then exchange A[i] A[largest] Max-Heapify(A,largest)

Build-Max-Heap : O(n) l Lager en heap fra et (ikke-ordnet) array, l i angir de indre nodene i heap en Eksempel 4 1 3 2 16 9 10 1 4 2 3 1 3 i Build-Max-Heap(A) heap-size[a] = length[a] for i = [length[a]/2] downto 1 do Max-heapify(A,i) 4 5 6 2 16 9 10

Build-Max-Heap : O(n) l Lager en heap fra et (ikke-ordnet) array, l i angir de indre nodene i heap en Eksempel 4 1 10 2 16 9 3 i 1 4 2 3 1 10 Build-Max-Heap(A) heap-size[a] = length[a] for i = [length[a]/2] downto 1 do Max-heapify(A,i) 4 6 7 2 16 9 3

Build-Max-Heap : O(n) l Lager en heap fra et (ikke-ordnet) array, l i angir de indre nodene i heap en Eksempel 4 16 10 2 1 9 3 1 4 i 3 16 10 Build-Max-Heap(A) heap-size[a] = length[a] for i = [length[a]/2] downto 1 do Max-heapify(A,i) 4 5 6 7 2 1 9 3

Build-Max-Heap : O(n) l Lager en heap fra et (ikke-ordnet) array, l i angir de indre nodene i heap en Eksempel 16 4 10 2 1 9 3 1 16 2 3 4 10 Build-Max-Heap(A) heap-size[a] = length[a] for i = [length[a]/2] downto 1 do Max-heapify(A,i) 4 5 6 7 2 1 9 3

Heapsort-Algoritmen: l Lag heap av tallene (i arrayet) l For siste posisjon til 2.: l Bytt med rota, og la heap-størrelsen minke med 1 l Kall Max-heapify på rotnoden for å gjenopprette heapegenskapen. l Selection sort, men med heap. Eksempel 14 8 7 2 4 1 14 8 7 Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1) 2 4 1

Heapsort : O(n*lg n) Eksempel 14 8 7 2 4 1 Usortert 14 8 7 i 2 4 1 (1) Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1) 1 8 7 Max-Heapify(A,1) Kapplinje 8 4 7 2 4 14 (2) 2 1 14 (2)

Heapsort : O(n*lg n) Eksempel 14 8 7 2 4 1 Usortert 8 4 7 2 1 14 (2) i Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1) 1 4 7 Max-Heapify(A,1) Kapplinje 7 4 1 2 8 14 (3) 2 8 14 (3)

Heapsort : O(n*lg n) Eksempel 14 8 7 2 4 1 Usortert i 7 4 1 2 8 14 (3) Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1) 2 4 1 Max-Heapify(A,1) Kapplinje 4 2 1 7 8 14 (4) 7 8 14 (4)

Heapsort : O(n*lg n) Eksempel 14 8 7 2 4 1 Usortert 4 2 1 7 8 14 (4) i ( Heapsort(A for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 ( Max-Heapify(A,1 1 2 4 Max-Heapify(A,1) Kapplinje 2 1 4 7 8 14 (5) 7 8 14 (5)

Heapsort : O(n*lg n) Eksempel 14 8 7 2 4 1 Usortert Sortert : A 1 2 4 7 8 14 i 2 1 4 7 8 14 (5) Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1) 1 2 4 Max-Heapify(A,1) Kapplinje 1 2 4 7 8 14 (2) 7 8 14 (3)

Kahoot!

Heapsort : O(n*lg n) l Kjøretid til heapsort l Heapsort bruker Ο(n lg n) tid l Siden kallet til Build-Max-Heap tar O(n) tid og l Hver av de n-1 kallene til Heapify tar O(lg n) tid l O(n) + O(n lg n) = O(n lg n) Heapsort(A) for i = [length[a]] downto 2 do exchange A[1] A[i] heap-size[a] = heap-size[a]-1 Max-Heapify(A,1)

Prioritetskøer bruker Heap l En prioritetskø er en datastruktur for å holde vedlike et sett av S verdier l Vi har to typer prioritetskøer: l En max-prioritets-kø l En min-prioritets-kø

Prioritets-kø : Operasjoner l Operasjoner på en max-prioritets-kø l Insert(S,x), kjøretid O(lg n) l Setter en node inn i heapen l Maximum(S), kjøretid O(1) l returnerer elementet S med den største verdien l Extract-Max(S), kjøretid O(lg n) l Returnerer elementet S med den største verdien l...og fjerner elementet fra heapen

Prioritets-kø : Operasjoner l Operasjoner på en max-prioritets-kø l Increase-Key(S,x,k), kjøretid O(lg n) l Øker verdien til et element x til en ny verdi k, l...som en antar er minst like stor som x l Operasjoner på en min-prioritets-kø l Insert(S,x), Minimum(S), Extract-Min(S), Decrease-Key(S,x,k)

Merge sort: l Splitt og hersk-sortering. l Del input i to like store biter. l Kjør mergesort rekursivt på hver av de to bitene. l Flett (merge) de to bitene sammen: l Velg det minste av bitenes første elementer helt til begge er tomme. l Returner den flettede listen. 30/09/14 54

Eksempel: merge sort Splitt: 86, 56, 12, 32, 84, 0, 89, 44 86, 56, 12, 32 84, 0, 89, 44 86, 56 12, 32 84, 0 89, 44 86 56 12 32 84 0 89 44 30/09/14 55

Hersk(Merge): 86 56 12 32 84 0 89 44 56, 86 12, 32 0, 84 44, 89 12, 32, 56, 86 0, 44, 84, 89 0, 12, 32, 44, 56, 84, 86, 89 30/09/14 56

Merge sort Hva skjer her? 12, 32, 56, 86 0, 44, 84, 89 0, 12, 32, 44, 56, 84, 86, 89 12 32 56 86 0 44 84 89 0 12 32 44 56 84 86 89 30/09/14 57

Kjøretid: Merge sort l T(n) = 2*T(n/2) + O(n) l Tid = Rekursive kall + Fletting = O( n lg n) 30/09/14 58

Merge sort: l Fordeler: l Worst-case kjøretid Θ(n lg n) for generelle sorteringsproblemer l Deler opp i uavhengige oppgaver, dvs parallelliserbar l Stabil, hvis merge implementeres riktig l Fungerer godt på lenket liste l Ulemper: l Trenger Θ(n) ekstra minne, ikke in-place

Quicksort: l Til forveksling lik mergesort, men: l Hersker før splitt l Bruker mindre minne l Istedet for fletting (merge) brukes partisjonering. 30/09/14 60

Quicksort: Partisjonering l Velger et element i input som kalles pivot element l Deler resten av input i to deler: l En del der alle tallene er mindre eller lik pivot elementet l En annen del der alle tallene er større enn pivot elementet. 30/09/14 61

Quicksort: fremgangsmåte l Quicksort partisjonerer input og kaller seg selv på hver av de to partisjonene. l Quicksort avslutter når det bare er ett element igjen. 30/09/14 62

Quicksort Pivot element 86, 56, 12, 32, 84, 0, 89, 44 0, 12 32 84, 89, 44, 86, 56 0 12 44 56 84, 89, 86 84 86 89 84, 86, 89 0, 12 44, 56, 84, 86, 89 0, 12, 32, 44, 56, 84, 86, 89 30/09/14 63

Quicksort Hva skjer her? 86, 56, 12, 32, 84, 0, 89, 44 0, 12 32 84, 89, 44, 86, 56 86, 56, 12, 32, 84, 0, 89, 44 32? 86, 56, 12, 44, 84, 0, 89, 32 32? 86, 56, 12, 44, 84, 0, 89, 32 32? 86, 56, 12, 44, 84, 0, 89, 32 30/09/14 64

32? 12, 56, 86, 44, 84, 0, 89, 32 12, 56, 86, 44, 84, 0, 89, 32 12, 56, 86, 44, 84, 0, 89, 32 12, 0, 86, 44, 84, 56, 89, 32 12, 0, 86, 44, 84, 56, 89, 32 12, 0, 32, 44, 84, 56, 89, 86 30/09/14 65

Quicksort : Algoritmen Quicksort(A,p,r): if p <r ( Partition(A,p,r then q = ( Quiksort(A,p,q-1 ( Quicksort(A,q+1,r Partition(A,p,r): x = A[r] i = p-1 for j = p to r-1 do if A[j] x then i = i+1 exchange A[i] A[j] exchange A[i] A[j] return i+1

Worst case Partition 1 2 n 1 2 n 2 2 n - n - n-1 - n-2 Dårlig pga svært skjeve splittinger; en region med bare ett element og den andre regionen (subarray) inneholder resten av elementene. n-1 n n-1 n - 3-2 Θ(n 2 ) hvis input-array allerede er sortert T(n) = T(n-1) + Θ(n) Θ(n 2 )

Best Case Partition 1 n/2 n T(n) = 2T(n/2) + Θ(n) Θ(n lg n)

Valg av pivot: l Valg av pivot har stor innflytelse på kjøretiden til quicksort. l For sortert input vil valg av første/siste element alltid gi kjøretid Θ(n 2 ). l Om man ikke kan finne et pivot element i O(1) vil det påvirke ytelsen. l Tilfeldig valgt pivot gir god ytelse, og worst case kjøretid Θ(n 2 ) oppstår med ekstremt lav sannsynlighet.

Quicksort: l Fordeler: l Effektiv på store lister l Deler opp i uavhengige oppgaver l Kan kombineres med andre sorteringsalgoritmer når listene blir små for å øke ytelsen (dette er det mest populære valget blant generelle sorteringsalgoritmer) l Ulemper: l Vanskelig å velge gode pivot-elementer uten å påvirke ytelsen.

Oppsummering kvaliteter Stabil En stabil sorteringsalgoritme tar vare på den eksisterende rekkefølgen til elementer som har samme verdi. Parallelliserbar Sorteringen kan splittes opp i deler som kan utføres uavhengig av hverandre. In Place Elementene kan befinne seg i lista under hele sorteringen. 30/09/14 71

Egenskaper: Heap sort Merge Sort Quicksort Stabil Parallelliserbar In-place 30/09/14 72

Kahoot!

Men

Telle-Sortering (Counting-Sort) l Sorteringsrutinen antar at hvert av de n- elementene, som skal sorteres, er heltall mellom 1 og k, der k er et heltall l Idé: For hvert element x skal vi finne antall elementer mindre enn eller lik x. l Informasjonen brukes til å plassere x direkte i det sorterte arrayet

Plassforbruk Tellesortering l Sorteringsrutinen krever stor plass da 3 array brukes l Array A[1..n] som skal sorteres l Array B[1..n] er sortert resultat l Array C[1..k] er temporært arbeidslager l Algoritmen sorterer i lineær tid l Θ(n), dersom k = O(n) l Generelt: Θ(n + k)

Eksempel

Eksempel 2 5 5 76 4

Eksempel 2 5 5 7 4

Eksempel 2 5 5 6 2 4

Eksempel 2 4 5 6 2 2 4

Eksempel 2 3 5 6 2 2 4 4

Eksempel 2 3 5 5 1 2 2 4 4

Eksempel 1 3 5 5 1 2 2 2 4 4

Eksempel 1 2 5 5 1 1 2 2 2 4 4

Radix-sort l Radix-sort sorterer input i flere omganger. l Først på minst signifikante siffer, så nest minst signifikante, osv til den til slutt sorterer på mest signifikante siffer. Element: {t d, t d-1 t 1 } Minst signifikante siffer Mest signifikante siffer

Radix-sort l Sorterer bits fra høyre til venstre Radix-Sort(A,d) for i=1 to d do use a stable sort to sort array A on digit i

Analyse Radix-Sort l Kjøretiden avhenger av hvilken sorteringsalgoritme som blir brukt l Ved bruk av Counting-sort: Θ(d(n + k)) l d er antall siffer. (k er tall i tallsystemet) l Når d er konstant og k = O(n) Θ(n) l Krever ekstra lagerplass, ikke in-place

Bucket sort: l Antar at input er jevnt fordelt over et intervall l Idé: l Vi deler opp intervallet i k = Θ(n) like store bøtter, for eksempel k = n. l Elementene som skal sorteres puttes i sine respektive bøtter, de minste elementene i den minste bøtta osv. l Hver bøtte sorteres med insertion sort. l Bøttene settes sammen til det ferdige resultatet. 30/09/14 89

Kjøretid l Innsetting i bøtter tar O(n) worst case. l Sorteringen i hver bøtte er avhengig av hvor mange elementer som finnes i den enkelte bøtte.

47 3 40 35 38 59 56 22 60 tall fra 0 til 60 0-10 10-20 20-30 30-40 40-50 50-60 Genererte bøtter hvor forventet innhold er et konstant antall elementer Forventet bøttestr. 10 elementer 30/09/14 91

Egenskaper: Counting sort Radix sort Bucket sort Stabil Parallelliserbar In-place 30/09/14 92

Sorteringsalgoritmer: Sammenligning: l O(n 2 ) l Bubble sort l Insertion sort l Selection sort Uten sammenligning: l O(n) l Counting sort l Radix sort l Bucket sort l O(n lg n) l Heapsort l Merge sort l Quicksort 30/09/14 93

Pipesortering liste = [] for x in stdin.readline().split(): liste.append(int(x)) sortert = sorter(liste) # Her skjer det noe for linje in stdin: ord = linje.split() minst = int(ord[0]) maks = int(ord[1]) resultat = finn(sortert, minst, maks) print str(resultat[0]) + " " + str(resultat[1]) 30/09/14 94

Pipesortering from sys import stdin def sorter(a): # Lista må returneres # SKRIV DIN KODE HER def finn(a, nedre, ovre): # Resultatet må returneres # SKRIV DIN KODE HER 30/09/14 95