Sökning och sortering

Relevanta dokument
Programmering för språkteknologer II, HT2014. Rum

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Programmering för språkteknologer II. OH-serie: Sökning och sortering. Algoritm

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 5 Innehåll

Programkonstruktion och Datastrukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 11 Datastrukturer (DAT037)

Datastrukturer D. Föreläsning 2

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Föreläsning 1 Datastrukturer (DAT037)

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Datastrukturer. föreläsning 2

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 5 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Asymptotisk komplexitetsanalys

Länkade strukturer, parametriserade typer och undantag

Föreläsning 13 Datastrukturer (DAT037)

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Magnus Nielsen, IDA, Linköpings universitet

Algoritmer. Två gränssnitt

Föreläsning 9. Sortering

Föreläsning 11 Innehåll

Algoritmer, datastrukturer och komplexitet

Algoritmer, datastrukturer och komplexitet

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 13 Datastrukturer (DAT037)

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Tommy Färnqvist, IDA, Linköpings universitet

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 12 Innehåll

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Föreläsning 4 Datastrukturer (DAT037)

Lösning av några vanliga rekurrensekvationer

Föreläsning 5. Rekursion

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Föreläsning Datastrukturer (DAT037)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 6 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Teoretisk del. Facit Tentamen TDDC (6)

Tentamen Datastrukturer D DAT 035/INN960

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 12 Innehåll

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

samt lite algoritmer en kortfattad introduktion för studenter på Intro:DV

Lösningsförslag till exempeltenta 1

Lösningsförslag för tentamen i Datastrukturer (DAT037) från

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning Datastrukturer (DAT037)

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Sökning och sortering

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 10 Erik Nilsson, Institutionen för Datavetenskap, LiU

Föreläsning 4 Datastrukturer (DAT037)

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 1. Introduktion. Vad är en algoritm?

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen Datastrukturer (DAT037)

Föreläsning 5. Rekursion

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Vad har vi pratat om i kursen?

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Teoretisk del. Facit Tentamen TDDC (6)

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Datastrukturer och algoritmer. Föreläsning 15 Inför tentamen

Lösningsförslag till tentamen Datastrukturer, DAT037,

Tentamen med lösningsförslag Datastrukturer för D2 DAT 035

Algoritmer, datastrukturer och komplexitet

Föreläsning Datastrukturer (DAT036)

Rekursion och induktion för algoritmkonstruktion

Rekursion och induktion för algoritmkonstruktion

Upplägg. Binära träd. Träd. Binära träd. Binära träd. Antal löv på ett träd. Binära träd (9) Binära sökträd (10.1)

Föreläsning 9 Innehåll

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Facit Tentamen TDDC (7)

Dugga Datastrukturer (DAT036)

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Problemlösning och algoritmer

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

DAI2 (TIDAL) + I2 (TKIEK)

Dekomposition och dynamisk programmering

Tentamen Datastrukturer, DAT037 (DAT036)

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din anmälningskod överst i högra hörnet på alla papper.

Datastrukturer och algoritmer

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Datastrukturer. föreläsning 3. Stacks 1

F5: Debriefing OU2, repetition av listor, träd och hashtabeller. Carl Nettelblad

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

DAT043 - föreläsning 8

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Föreläsning REPETITION & EXTENTA

TDDC Terminologi Uppdaterad Fö #1

Transkript:

Sökning och sortering Programmering för språkteknologer 2 Sara Stymne 2013-09-16

Idag Sökning Analys av algoritmer komplexitet Sortering

Vad är sökning? Sökning innebär att hitta ett värde i en samling av värden Vi kommer att fokusera på att hitta ett värde i en array Returvärden Om värdet finns: index för den plats där det finns Om värdet inte finns: -1

Vad är sökning? Sökning innebär att hitta ett värde i en samling av värden Vi kommer att fokusera på att hitta ett värde i en array Returvärden Om värdet finns: index för den plats där det finns Om värdet inte finns: -1 (omöjligt som index)

Vad är sökning? Sökning innebär att hitta ett värde i en samling av värden Vi kommer att fokusera på att hitta ett värde i en array Returvärden Om värdet finns: index för den plats där det finns Om värdet inte finns: -1 (omöjligt som index) Tillvägagångssätt beror på arrayen Osorterad Sorterad

Vad är sökning? Sökning innebär att hitta ett värde i en samling av värden Vi kommer att fokusera på att hitta ett värde i en array Returvärden Om värdet finns: index för den plats där det finns Om värdet inte finns: -1 (omöjligt som index) Tillvägagångssätt beror på arrayen Osorterad Linjär sökning Sorterad Binär sökning

Linjär sökning Hitta ett värde i en osorterad array Lösning: Loopa igenom arrayen tills vi hittar värdet, eller tills vi letat igenom hela arrayen om det inte finns

Linjär sökning Hitta ett värde i en osorterad array Lösning: Loopa igenom arrayen tills vi hittar värdet, eller tills vi letat igenom hela arrayen om det inte finns public static int linsearch(int[] arr, int target) { for (int i=0; i < arr.length; i++) { if (arr[i]==target) { return i; // first hit index } } return -1 }

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? I värsta fall? I genomsnitt?

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? I genomsnitt?

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? n värdet finns ej, alla positioner måste letas igenom I genomsnitt?

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? n värdet finns ej, alla positioner måste letas igenom I genomsnitt? n/2 om vi bara letar efter värden som finns

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? n värdet finns ej, alla positioner måste letas igenom I genomsnitt? n/2 om vi bara letar efter värden som finns n/2 < t < n om vi även letar efter värden som inte finns

Hur lång tid tar linjär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayens storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? n värdet finns ej, alla positioner måste letas igenom I genomsnitt? n/2 om vi bara letar efter värden som finns n/2 < t < n om vi även letar efter värden som inte finns Beror även på fördelningen av värden i arrayen

Binär sökning Om arrayen är sorterad kan vi utnyttja det för snabbare sökning

Binär sökning Om arrayen är sorterad kan vi utnyttja det för snabbare sökning Leta i mitten först Om det är rätt värde, returnera Om värdet är mindre än mittenvärdet, leta i den undre delen Om värdet är mindre än mittenvärdet, leta i den övre delen Upprepa!

Binär sökning rekursiv public static int binsearch(int[] arr, int target) { return binsearch(arr,target,0,arr.length-1); } public static int binsearch(int[] arr, int target, int low, int high) { if (high < low) { return -1; } else { int mid = (low+high)/2; if (arr[mid] == target) { return mid; } else if (arr[mid] > target) { return binsearch(arr,target, low, mid-1); } else { // (arr[mid] < target) return binsearch(arr,target, mid+1, high); } } }

Rekursion Rekursiv funktion funktion som anropar sig själv En rekursiv funktion har två typer av fall: Basfall fall där lösningen är trivial Rekursiva fall fall där metoden anropar sig själv

Rekursion Rekursiv funktion funktion som anropar sig själv En rekursiv funktion har två typer av fall: Basfall fall där lösningen är trivial Binär sökning: -1 om svaret inte finns, samt korrekt index om vi hittat rätt värde Rekursiva fall fall där metoden anropar sig själv Binär sökning: sök vidare i ena halvan genom att anropa sig själv

Binär sökning iterativ public static int binsearch(int[] arr, int target) { return binsearch(arr,target,0,arr.length-1); } public static int binsearchlin(int[] arr, int target, int low, int high) { while (high >= low) { int mid = (low+high)/2; if (arr[mid] > target) { high = mid - 1; } else if (arr[mid] < target) { low = mid + 1; } else { //arr[low] == target return mid; } } return -1; }

Hur lång tid tar binär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayen storlek: n Hur lång tid tar sökningen: I bästa fall? I värsta fall? I genomsnitt?

Hur lång tid tar binär sökning? Räkna tiden i antal jämförelser (==) som görs Baserat på arrayen storlek: n Hur lång tid tar sökningen: I bästa fall? 1 värdet finns först i arrayen I värsta fall? log n värdet finns ej I genomsnitt? 1 < t log n

Sökning jämförelse Linjär Binär Kan användas alltid för sorterad array För länkad lista ja nej Tid (värsta) n log n Implementering extremt lätt något krångligare

Sökning alternativ Linjär och binär sökning fungerar bra för arrayer Man kan dock använda alternativa datastrukturer för att underlätta sökning: Binära sökträd Alternativ datastruktur till array Hashtabeller Lookup ur en hashtabell är i regel snabbt

Algoritmer och datastrukturer Algoritm en systematisk procedur som i ett andligt antal steg anger hur man utför en beräkning eller löser ett givet problem (NE) En beskrivning av hur man löser ett problem Datastruktur En struktur som används för att lagra data, till exempel länkad lista, array, hashtabell

Algoritmer och datastrukturer Algoritm en systematisk procedur som i ett andligt antal steg anger hur man utför en beräkning eller löser ett givet problem (NE) En beskrivning av hur man löser ett problem Datastruktur En struktur som används för att lagra data, till exempel länkad lista, array, hashtabell Vilka algoritmer som är tillämpbara för ett problem beror delvis på vilken datastruktur som används

Analys av algoritmer Viktiga frågor att besvara om ett program/algoritm Ger den ett korrekt resultat? Ger den alltid lösning? (fastnar ej i oändlig loop, tex) Hur snabb är den? Hur mycket minne kräver den?

Analys av algoritmer Viktiga frågor att besvara om ett program/algoritm Ger den ett korrekt resultat? Ger den alltid lösning? (fastnar ej i oändlig loop, tex) Hur snabb är den? tidskomplexitet Hur mycket minne kräver den?

Tidskomplexitet Hur kan man avgöra vilken algoritm som är den snabbaste för att lösa ett ett problem?

Tidskomplexitet Hur kan man avgöra vilken algoritm som är den snabbaste för att lösa ett ett problem? Att mäta faktisk tid är opraktiskt olika datorer är olika effektiva till exempel

Tidskomplexitet Hur kan man avgöra vilken algoritm som är den snabbaste för att lösa ett ett problem? Att mäta faktisk tid är opraktiskt olika datorer är olika effektiva till exempel Använd asymptotisk analys tendensen på lång sikt

Asymptotisk analys Analys av hur tiden för en algoritm växer när storleken på indata växer Storlek? Array: antal element Sträng: antal tecken Allmänna fallet: ofta antal byte Vi kan diskutera olika fall Värsta Genomsnittliga Bästa

Asymptotisk analys Analys av hur tiden för en algoritm växer när storleken på indata växer Storlek? Array: antal element Sträng: antal tecken Allmänna fallet: ofta antal byte Vi kan diskutera olika fall Värsta Vanlig analys Genomsnittliga Görs ofta, men är ofta svårare Bästa Ofta inte så meningsfull

Asymptotisk analys Grundkrav: En algoritm ska fungera för indata av godtycklig storlek (n) Beräkna körtiden som en funktion av storleken på indata T (n) Ignorera konstanta faktorer Fokusera på dominerande faktorer vid stora indata

Asymptotisk analys Grundkrav: En algoritm ska fungera för indata av godtycklig storlek (n) Beräkna körtiden som en funktion av storleken på indata T (n) Ignorera konstanta faktorer Fokusera på dominerande faktorer vid stora indata Analysen ska vara maskinoberoende Kraftfulla maskiner ökar hastigheten med en konstant

Primitiva operationer En primitiv operation antas ta konstant tid: Tilldelning, ex. x = y; Aritmetiska operationer, ex. x+5; Jämförelser, ex. x < 5; Arrayindexeringar, ex. myarray[5]; Metodretur, ex. return 5;... Låt T(n) vara antalet primitiva operationer som en funktion av storleken på indata

Exempel multiplicera talen i en array public static int multiply(int[] arr) { int res = 1; int i=0; for (; i < arr.length; i++) { res = res * arr[i]; } return res; }

Exempel multiplicera talen i en array public static int multiply(int[] arr) { int res = 1; 1 int i=0; 1 for (; i < arr.length; i++) { 1+1 (*n) res = res * arr[i]; 1+1+1 (*n) } return res; 1 } T (n) = 5 n + 3

Ordo O Ordo (big-o) är en övre gräns (upper bound) för hur tiden för en algoritm växer Definition: T (n) är en icke-negativ funktion T (n) O(f(n)) (dvs. T (n) tillhör mängden O(f(n))) om det finns positiva konstanter c och n 0 sådana att T (n) c f(n) för n n 0

Exempel multiplicera talen i en array public static int multiply(int[] arr) { int res = 1; 1 int i=0; 1 for (; i < arr.length; i++) { 1+1 (*n) res = res * arr[i]; 1+1+1 (*n) } return res; 1 } T (n) = 5 n + 3

Exempel multiplicera talen i en array T (n) = 5 n + 3 Antagande: f(n) = n 5 n + 3 cn (c 5) n 3 n 3 c 5 Låt c = 6, n 0 = 3 5 n + 3 6 n för n 3 T (n) O(n)

Tidskomplexitet fall Tidskomplexiteten gäller för ett visst fall Värsta Bästa Medel För multiplikation av värden i en array spelar det ingen roll, men i andra fall kan det göra det. Viktigt att vara tydlig med vad man menar!

Tidskomplexitet linjär sökning Värsta fallet: O(n) Bästa fallet: O(1) 1 används om det tar konstant tid

Tidskomplexitet linjär sökning Värsta fallet: O(n) Bästa fallet: O(1) 1 används om det tar konstant tid Medelfallet: O(n) Antag att medelfallet tar tiden T (n/2) n/2 = n 1/2 1/2 är en konstant vi kan bortse ifrån

Tidskomplexitet binär sökning Värsta fallet: O(log n) Bästa fallet: O(1) Medelfallet: O(log n)

Tidskomplexitet beräkning När man anger komplexitet bortser man från konstanter och termer av lägre ordning Exempel: T (5 + n) O(n) T (5 + 10n) O(n) T (500000 + 100000n) O(n)

Tidskomplexitet beräkning När man anger komplexitet bortser man från konstanter och termer av lägre ordning Exempel: T (5 + n) O(n) T (5 + 10n) O(n) T (500000 + 100000n) O(n) T (n 2 + n) O(n 2 ) T (15n 2 + 5/8 n) O(n 2 ) T (n + log n) O(n) T (25n log n + 800) O(n log n)

Ordoklasser Ordo Benämning O(1) Konstant O(log n) Logaritmisk O(n) Linjär O(n log n) O(n 2 ) Kvadratisk O(n 3 ) Kubisk O(n x ) Polynomisk (för x > 1) O(2 n ) Exponentiell O(n!) Faktoriell

Asymptotisk storlek spelar roll! 400 350 300 2^n n^2 n log n n log n 250 200 150 100 50 0 0 5 10 15 20 25 30 n

Asymptotisk storlek spelar roll trots konstanter! 400 350 2^n 2n^2 20n 10n 300 250 200 150 100 50 0 0 5 10 15 20 25 30 n

Omega och Theta O övre gräns (upper bound) Även andra varianter finns: Ω undre gräns (lower bound) Θ T (n) Θ(n) iff T O(n) och T Ω(n)

Asymptotisk analys diskussion Asymptotisk analys är ett bra verktyg för att diskutera algoritmer För stor indata är alltid en algoritm med högre komplexitet långsammare Men vad stor innebär kan variera För små indata kan en algoritm vara bättre som har högre komplexitet Exempel: För riktigt små arrayer kan linjär sökning vara snabbare än binär sökning eftersom vi inte behöver beräkna medelvärden

Asymptotisk analys diskussion Asymptotisk analys är ett bra verktyg för att diskutera algoritmer För stor indata är alltid en algoritm med högre komplexitet långsammare Men vad stor innebär kan variera För små indata kan en algoritm vara bättre som har högre komplexitet Exempel: För riktigt små arrayer kan linjär sökning vara snabbare än binär sökning eftersom vi inte behöver beräkna medelvärden Man kan diskutera minneskomplexitet på samma sätt som tidskomplexitet

Algoritmanalys vad ska ni kunna? Föra grundläggande resonemang kring tidskomplexiteten för ett program/algoritm för en övre gräns i olika fall (Ordo) Speciellt med avseende på: De sök- och sorteringsalgoritmer som tas upp under kursen Vanliga operationer för de datastrukturer som tas upp under kursen Utifrån enklare kod komma resonera er fram till tidskomplexiteten (som exemplet med multiplikation av värdena i en array)

Vad är sortering Placera objekten i en samling i en viss ordning Vi fokuserar på sortering i en array De viktigaste operationerna som kan användas då är compare, eller ==, <, > jämför två värden swap byt plats på två värden

Sorteringsalgoritmer Det finns en mängd olika sorteringsalgoritmer Enkla algoritmer, mindre effektiva Selection sort Bubble sort Insertion sort Mer komplexa och effektiva algoritmer Merge sort Quick sort Shell sort

Selection sort Urvalssortering DEMO!!

Selection sort Urvalssortering DEMO!! Intuition: 1. Dela upp arrayen i en sorterad del (tom från början) och en osorterad del (hela arrayen från början) 2. leta upp det minsta värdet i den osorterade delen 3. lägg det sist i den sorterade delen 4. Upprepa steg 2+3 tills hela arrayen är sorterad

Selection sort kod public void sort(int[] lista) for(int i = 0; i < lista.length - 1 ; ++i) { int minindex = i; for(int j = i+1; j < lista.length; ++j) { if (lista[j] < lista[minindex]) { minindex = j; } } swap(lista, i, minindex); } } public void swap(int[] lista, int i, int j) { int temp = lista[i]; lista[i] = lista[j]; lista[j] = temp; }

Selection sort komplexitet public void sort(int[] l) for(int i = 0; i < l.length - 1 ; ++i) { // n-1 int minindex = i; for(int j = i+1; j < l.length; ++j) { // n-1+n-2+...+2+1 if (lista[j] < l[minindex]) { // konstant minindex = j; // konstant } } swap(l, i, minindex); // konstant } }

Selection sort komplexitet public void sort(int[] l) for(int i = 0; i < l.length - 1 ; ++i) { // n-1 int minindex = i; for(int j = i+1; j < l.length; ++j) { // n-1+n-2+...+2+1 if (lista[j] < l[minindex]) { // konstant minindex = j; // konstant } } swap(l, i, minindex); // konstant } } n + n 1 + n 2 +... + 2 + 1 = (n2 +n) 2 O(n 2 ) så kallade triangeltal

Bubble sort och insertion sort DEMO!!

Bubble sort Bubbelsortering Intuition: 1. Dela upp arrayen i en sorterad del (tom från början) och en osorterad del (hela arrayen från början) 2. För varje par av värden från höger till vänster i den osorterade delen Byt plats om det högra värdet < det vänstra värdet 3. Detta innebär att det minsta värdet bubblas upp till den första platsen i den osorterade delen, och kan flyttas över till en sorterade delen 4. Upprepa tills hela arrayen är sorterad

Insertion sort Insättningssortering Intuition: 1. Dela upp arrayen i en sorterad del (tom från början) och en osorterad del (hela arrayen från början) 2. Flytta det första värdet i den osorterade delen till rätt plats i den sorterade delen 3. Upprepa tills hela arrayen är sorterad

Komplexitet bubble sort och insertion sort O(n 2 ) Använd samma resonemang som för selection sort

Sorteringsalgoritmer egenskaper Tidskomplexitet hur snabbt går den? Minneskomplexitet hur mycket minne tar den? Stabilitet ligger lika värden i samma ordning som innan sorteringen

Sorteringsalgoritmer egenskaper Tidskomplexitet hur snabbt går den? Minneskomplexitet hur mycket minne tar den? Stabilitet ligger lika värden i samma ordning som innan sorteringen För de algoritmer vi gått igenom hittills: Tid: O(n 2 ) Minne: O(n) för själva arrayen, O(1) extra minne Stabila

Sorteringsalgoritmer egenskaper Tidskomplexitet hur snabbt går den? Minneskomplexitet hur mycket minne tar den? Stabilitet ligger lika värden i samma ordning som innan sorteringen För de algoritmer vi gått igenom hittills: Tid: O(n 2 ) Minne: O(n) för själva arrayen, O(1) extra minne Stabila Det finns mer avancerade algoritmer med tidskomplexitet O(n log n) Det är gränsen för hur snabba sorteringsalgoritmer som baseras på jämförelser kan vara Dessa algoritmer är dock inte alltid stabila, och de kan ta extra minne

Avancerade sorteringsalgoritmer Merge sort Värsta fallet: O(n log n) Stabil Behöver extra minne (lite olika beroende på hur den implementeras)

Avancerade sorteringsalgoritmer Merge sort Värsta fallet: O(n log n) Stabil Behöver extra minne (lite olika beroende på hur den implementeras) Quick sort Medelfallet: O(n log n) Värsta fallet: O(n) Ej stabil Behöver lite extra minne, beror på implementationen

Avancerade sorteringsalgoritmer Merge sort Värsta fallet: O(n log n) Stabil Behöver extra minne (lite olika beroende på hur den implementeras) Quick sort Medelfallet: O(n log n) Värsta fallet: O(n) Ej stabil Behöver lite extra minne, beror på implementationen Shell sort Komplexitet svåranalyserad Beroende på implementation värsta fallet runt O(n 3/2 ) Ej stabil Inget extra minne

Ordnade klasser Java har ett interface Comparable Innehåller metoden int compareto(t t) som returnerar: 0 if the object is equal to t < 0 if the object is smaller than t > 0 if the object is larger than t Detta interface krävs när Java behöver kunna jämföra instanser av objekt, till exempel vid sortering

Lab 2, del 1 Sortering av heltal i ett grafiskt labskal Implementera två sorteringslagoritmer själva (insertion och shell sort) Jämför fem sorteringsalgoritmer under olika förutsättningar koppla till teorin

Lab 2, del 1 Sortering av heltal i ett grafiskt labskal Implementera två sorteringslagoritmer själva (insertion och shell sort) Jämför fem sorteringsalgoritmer under olika förutsättningar koppla till teorin Labskalet begränsat för att kunna synkronisera algoritmerna Tillhandahåller följande metoder: cmp(i,j) jämför värdena på plats i och j i arrayen (jfr compareto) swap(i,j) byter plats på värdena på plats j och i elementcount() hur många element finns det i arrayen (jfr length/size())

Mer om sorteringslagoritmer Vi har bara gått igenom kod för en sorteringsalgoritm idag Ni ska kunna beskriva alla de algoritmer som vi gått igenom Kunna visa hur de fungerar genom ett exempel för en array Kunna skriva (pseudo)kod för dem I labben får ni skriva egen kod för två algoritmer Labben innehåller även given kod för andra algoritmer studera den Läs i kursböckerna om sorteringsalgoritmer Även (engelska) Wikipedia har bra material om sortering

I veckan Tisdag Deadline för lab 1! Onsdag Föreläsning Generiska algoritmer och klasser (behövs för lab 2, del 2) Länkade listor mm (behövs för lab 3) Mer om komplexitet Lab Jobba själv innan onsdag Sätt igång med del 1 i lab 2 Läs på om sökning, sortering, komplexitet Komplexitet: grundläggande Eck 8.5, mer avancerat Shaffer 3.1 3.7