Föreläsning 9. Sortering

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

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 11 Datastrukturer (DAT037)

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

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

Sökning och sortering

Föreläsning 12. Söndra och härska

Tommy Färnqvist, IDA, Linköpings universitet

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 12. Söndra och härska

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

Föreläsning 11 Innehåll

Seminarium 13 Innehåll

Träd Hierarkiska strukturer

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Tentamen Datastrukturer D DAT 036/INN960

Tentamen Datastrukturer D DAT 036/INN960

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

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

Algoritmer. Två gränssnitt

Datastrukturer, algoritmer och programkonstruktion (DVA104, HT 2014) Föreläsning 5

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning 12 Innehåll

ADT Prioritetskö. Föreläsning 12 Innehåll. Prioritetskö. Interface för Prioritetskö. Prioritetsköer och heapar

Vad har vi pratat om i kursen?

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

Tentamen TEN1 HI

Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Föreläsning 12 Innehåll

ID1020: Quicksort. Dr. Jim Dowling kap 2.3. Slides adapted from Algoritms 4 th Edition, Sedgewick.

Lösningar Datastrukturer TDA

Tentamen Datastrukturer D DAT 035/INN960

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 13 Innehåll

Tentamen TEN1 HI

Föreläsning 4 Datastrukturer (DAT037)

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

Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Teoretisk del. Facit Tentamen TDDC (6)

Föreläsning 4 Datastrukturer (DAT037)

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

Ett generellt träd är. Antingen det tomma trädet, eller en rekursiv struktur: rot /. \ /... \ t1... tn

Föreläsning 13 Datastrukturer (DAT037)

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

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

Facit Tentamen TDDC (7)

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Facit Tentamen TDDC kl (6)

Föreläsning Datastrukturer (DAT037)

Föreläsning 7. Träd och binära sökträd

SORTERING OCH SÖKNING

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

Tentamen Datastrukturer D DAT 036/DIT960

Tentamen Datastrukturer för D2 DAT 035

Föreläsning 2 Datastrukturer (DAT037)

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

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

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

Föreläsning REPETITION & EXTENTA

Föreläsning 13 Datastrukturer (DAT037)

Datastrukturer D. Föreläsning 2

Tommy Färnqvist, IDA, Linköpings universitet. 1 Sortering Heap-sort Merge-sort Sammanfattning... 10

KTH, NADA, Vahid Mosavat. 1. Flervalsfrågor (5p)

Tildatenta Lösningsskiss

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Försättsblad till skriftlig tentamen vid Linköpings Universitet

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

Programkonstruktion och. Datastrukturer

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

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning Datastrukturer (DAT036)

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 5 Innehåll

Tentamen Datastrukturer (DAT037)

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Föreläsning 14 Innehåll

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

Föreläsning 5. Rekursion

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

Arrayer (fält)

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning Datastrukturer (DAT037)

Föreläsning 9 Innehåll

Fredag 10 juni 2016 kl 8 12

Datastrukturer och algoritmer

Algoritmer, datastrukturer och komplexitet

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Sortering. Intern/ extern? Antaganden. Vad kan vi kräva? Rank sort. Rank sort. På en nod/ distribuerad? Jämförelsebaserad/ icke jämförelsebaserad?

Föreläsning 7. Träd och binära sökträd

Sökning. Översikt. Binärt sökträd. Linjär sökning. Binär sökning. Sorterad array. Linjär sökning. Binär sökning Hashtabeller

Föreläsning 1 Datastrukturer (DAT037)

Tentamen, Algoritmer och datastrukturer

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

Föreläsning 5 Datastrukturer (DAT037)

Länkade strukturer, parametriserade typer och undantag

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

Datastrukturer. föreläsning 6. Maps 1

Tentamen i Algoritmer & Datastrukturer i Java

Tentamen kl Uppgift 4. Uppgift 5

Transkript:

Föreläsning 9 Sortering

Föreläsning 9 Sortering Sortering och Java API Urvalssortering Instickssortering Söndra och härska Shellsort Mergesort Heapsort Quicksort Bucketsort Radixsort Läsanvisningar och uppgifter

Sortering Med sortering ska vi här mena att ordna element efter elementens nycklar i stigande (eller fallande) ordning Vi ska lära oss använda sorteringsmetoderna i Java Api men också lära oss implementera egna. Det gör vi av flera skäl: För att kunna implementera dem vid behov För att förstå när vi ska använda vilken metod För att algoritmerna är bra exempel på problemlösning och idéerna är tillämpbara även på andra problem För att träna oss på att analysera algoritmer

Egenskaper hos sorteringsalgoritmer Antal jämförelser: värst, medel, bäst Antal platsbyten: värst, medel, bäst Minnesbehov Stabilitet: Behåller den ordningen på element som är lika stora?

Sortering i Java API java.util.arrays.sort kan anropas med en array av godtycklig primitiv typ eller av object. Består arrayen av Object måste dessa implementera Comparable (och därmed ha compareto-metoden) eller så måste en Comparator skickas med. Primitiva datatyper sorteras med quicksort och objekt med mergesort. Båda är O(n log n) java.util.collections.sort sorterar collections som implementerar List (arraylist och LinkedList). Också här måste man implementera Comparable eller skicka med en Comparator. Denna kopierar objekten till en array, sorterar arrayen och kopierar tillbaka.

Läs mer i KW 8.1

Algoritmer Vi kommer att fokusera denna föreläsning på att undersöka olika sorteringsalgoritmer. Andra algoritmer och varianter av dessa kan du hitta massor av på nätet. I diskussionen tänker vi oss för enkelhetens skull alltid att vi sorterar en array a[] med n element av typen int och att index går från 0 till n-1.

Urvalssortering (Selection Sort) Ide: Hitta det minsta elementet och sätt det först. Hitta det näst minsta elementet och sätt det på nästa plats osv. Algoritm: För index = 0 till n-2 minindex = index För i = index+1 till n-1 Om a[i]<a[minindex] minindex = i byt plats på a[index] och a[minindex] Implementera en static selectionsort för int[]

Analys urvalssortering För plats = 0 till n-2 minindex = plats För i = plats+1 till n-1 Om a[i]<a[minindex] minindex = i byt plats på a[plats] och a[minindex] Antalet jämförelser (n-1)+(n-2)+(n-3)+ +1=n(n-1)/2=O(n 2 ) oberoend array så att Bästa, medel, värsta alla är O(n 2 ) Antal platsbyten: n-1=o(n) Minneskrav: O(1) (utöver arrayen) Stabil: Ej med normal implementering Användning Den är enkel och intuitiv att implementera. Dessutom om man har en array av struktar i ett språk som C där nyckeln är liten och går snabbt att jämföra medans datat i structen är enormt och därmed tar tid att flytta kan denna metod vara optimal eftersom den behöver mycket få platsbyten. I Java flyttar vi normalt endast referenser så då spelar detta mindre roll.

Instickssortering (Insertion sort) Ide: Om vi har ett sorterat material kan vi stoppa in ett tal till på rätt ställe och då har vi fortfarande ett sorterat material. Vi börjar med första talet som sorterat material och stoppar in nästa tal. Nu har vi en sorterad lista med två tal. Nu stoppar vi in tredje talet på rätt ställe. Algoritm: För index = 1 till n-1 Sätt in a[index] på rätt plats i arrayen: a[0],,a[index-1] Detaljerad:Kolla! För index = 1 till n-1 data = a[index] dataindex=index Medans dataindex>0 och data<a[dataindex-1] a[dataindex] = a[dataindex-1] dataindex-- a[dataindex] = data Implementera en static insertionsort för int[]

Analys instickssortering För index = 1 till n-1 data = a[index] dataindex=index Medans dataindex>0 och data<a[dataindex-1] a[index] = a[dataindex] dataindex-- a[dataindex] = data Antal jämförelser Värst: 1+2+3+ +(n-1)=o(n 2 ) Bäst: n-1=o(n) (sorterad) Tilldelningar Följer jämförelserna: Värst O(n 2 ), Bäst O(n) Observera att vi här inte gör ett byte (swap med tmp-lagring) utan bara en tilldelning Minneskrav: O(1) (utöver arrayen) Stabil: Ja Användning Även om den gör färre jämförelser än urvalssortering (ca hälften) är den fortfarande O(n 2 ) i snitt och olämplig för stora arrayer. Däremot är den en av de snabbaste algoritmerna för små arrayer. Vad är då nyttan med att sortera en liten array snabbt? Jo en del andra algoritmer sorterar genom att sortera små delarrayer. Dessa algoritmer kan då optimeras genom att små arrayer sorteras med instickssortering. Dessutom är den snabb O(n) på sorterade arrayer och då också ganska snabb på ganska sorterade arrayer. Något vi ska använda i nästa algoritm.

Jämförelse av kvadratiska sorteringsalgoritmer

Söndra och härska (Divide and conquer) Innan vi ger oss på några lite mer avancerade sorteringsalgoritmer ska vi säga några ord om det design paradigm shellsort, mergesort och quicksort hör till. En söndra och härska algoritm bryter ner ett problem i två eller fler subproblem av samma (eller närliggande) typ. Dessa i sin tur brytes också ner i två eller fler subproblem. Algoritmen fortsätter så till dess att subproblemen blivit så små att de är lätta att lösa och kombinerar då dellösningarna till en lösning på hela problemet oftast i samma steg som problemet bröts ner. Precis som det låter gör man detta oftast och enklast med rekursion.

Exempel på söndra och härska Största värdet i en array:

Exponentiering Hur många multiplikationer behöver man utföra för att beräkna 7 4? exp(a,b) Om b==1 return a p=exp(a,b/2) Om b%2==0 return p*p return p*p*a Precis som binär sökning i sorterad array är detta inte riktigt en söndra och härska algoritm eftersom vi delar upp problemet i ett subproblem. Namnet decrease and conquer har föreslagits för dessa algoritmer.

Shellsort (Donald L. Shell) Kanske inte det tydligaste exemplet på söndra och härska men kan ses som en sådan. Grundiden är att dela upp vår array i små subarrayer (utspridda över arrayen) och sortera dessa med instickssortering. Vi har nu en något mer sorterad array. Denna delar vi upp i lite färre subarrayer som vi sorterar med instickssortering. Vi har nu en ännu mer sorterad array som vi delar upp i ännu färre subarrayer som vi sorterar med instickssortering. Till slut sorterar vi hela den nu nästan sorterade arrayen med instickssortering. Anledningen till att detta blir effektivt är: 1. Instickssortering är snabb på små arrayer 2. Instickningssortering drar nytta av ordning som redan finns i arrayen (O(n) för en sorterad array) 3. Element som befinner sig på helt fel plats flyttas direkt långt istället för att sakta via jämförelser med grannar flyttas till rätt plats

[0] [1] [2] [3] [4] 40 35 80 75 60 Exempel på en sortering För att förstå principen ska vi titta på en sortering av en konkret array med 15 platser. Först väljer vi ett gap som ger oss våra subarrayer. Vi börjar här med gap = 7. Vilket ger totalt 7 subarrayer [5] [6] [7] [8] [9] 90 70 75 55 90 [10][11] [12] [13] [14][15] 85 34 45 62 57 65 subarray 1 [0] [1] [2] [3] [4] 40 35 80 75 60 [5] [6] [7] [8] [9] 90 70 75 55 90 [10][11] [12] [13] [14][15] 85 34 45 62 57 65 [0] [1] [2] [3] [4] 40 35 80 75 60 subarray 2 [5] [6] [7] [8] [9] 90 70 75 55 90 [10][11] [12] [13] [14][15] 85 34 45 62 57 65 subarray 3 Osv.

Dessa sju subarrayer sorteras nu var och en (dock inte en klart och sedan nästa) med instickssortering och vi får: [0] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10][11] [12] [13] [14][15] 40 35 80 75 34 45 62 57 55 90 85 60 90 70 75 65 Vi väljer nu gap=3 och får då tre subarrayer [0] [1] [2] [3] [4] 40 35 80 75 34 [5] [6] [7] [8] [9] 45 62 57 55 90 [10][11] [12] [13] [14][15] 85 60 90 70 75 65 Dessa tre subarrayer sorteras nu var och en med instickssortering och vi får: [0] [1] [2] [3] [4] 40 34 45 62 35 [5] [6] [7] [8] [9] 55 65 57 60 75 [10][11] [12] [13] [14][15] 70 75 90 85 80 90 Vi väljer nu gap=1 och får då en array och sorterar denna med instickssortering. Detta går då fort då den redan är rätt sorterad och vi för varje instick inte behöver leta så långt innan vi hittar rätt plats. [0] [1] [2] [3] [4] 34 35 40 45 55 [5] [6] [7] [8] [9] 57 60 62 65 70 [10][11] [12] [13] [14][15] 75 75 85 80 90 90

Shell sort algoritm gap = n/2 medans gap>0 För index = gap till n-1 Instickssortera elementet i sin subarray Om gap==2 gap=1 annars gap=gap/2.2 Detaljerat: gap = n/2 medans gap>0 För index = gap till n-1 data = a[index] dataindex=index Medans dataindex>gap-1 och data<a[dataindex-gap] a[index] = a[dataindex-gap] dataindex-=gap a[dataindex] = data Om gap==2 gap=1 annars gap=gap/2.2

Analys Shell sort Hur vi väljer våra gap är avgörande för prestandan. Den generella algoritmen är ännu inte analyserad och ingen teori ger oss de bäst gapen. Väljer man 2 k (dvs 16, 8, 4, 2, 1) får man O(n 2 ) men väljer man 2 k -1(dvs 15, 7, 3, 1) får man O(n 3/2 ). Andra val ger ännu bättre resultat. Empiriskt har man visat att om man börjar med n/2 och sedan delar gapet på 2,2 får man O(n 5/4 ) eller kanske O(n 7/6 ). Minneskrav: O(1) (utöver arrayen) Stabil: Nej Användning: Är långsammare än de vi ska titta på senare men har den fördelen att den inte använder något extra utrymme (in place) och används därför ibland i inbyggda system (finns i linuxkärnan). Den kan också användas för mindre subarrayer i andra algoritmer som riskerar att bli ineffektiva på mindre arrayer.

Mergesort Ett mycket typiskt exempel på söndra och härska. Algoritm: Dela upp arrayen i två lika stora arrayer Sortera vänster array Sortera höger array Sammanfoga de två arrayerna till en sorterad array (merge) Hur sorterar vi då vänster array? Jo vi delar upp den i två delar. Stoppvillkoret är att en array med ett element är sorterad

Algoritm merge villkor: a[0],,a[n-1] och b[0],,b[m-1] sorterade merge(a,b,c) indexa=0,indexb=0, indexc=0 Medans indexa<n och indexb<m Om a[indexa]<=b[indexb] c[indexc++]=a[indexa] indexa++ annars c[indexc++]=b[indexb] indexb++ Medans indexa<n c[indexc++]=a[indexa] indexa++ Medans indexb<n c[indexc++]=b[indexb] indexb++ (= - ger stabil mergesort) Tidsåtgången är O(n+m) och extra minne krävs O(n+m) med denna algoritm Implementera!

Algoritm för mergesort mergesort(a) Om a.length == 1 return b[0, ]=a[0,,a.length/2] c[0, ]=a[a.length/2+1,.,a.length-1] mergesort(b) mergesort(c) merge(b,c,a) return Implementera!

Analys mergesort I varje steg halveras längden av arrayen vilket ger att antalet steg blir log 2 (n). I varje steg kopieras alla element två gånger vilket ger 2n. Tilldelningar:O(nlogn) Jämförelser: Värst:O(nlogn), Bäst:O(n) Minnesbehovet när det är som störst är förutom arrayen 2n = O(n). Det finns dock versioner som sorterar på plats (dessa får dock O(n(logn) 2 ) och versioner som endast behöver n/2 extra utrymme. Stabil: Ja Variant: Det förekommer att man slutar använda mergesort vid en viss storlek S och då istället gör instickssortering. S är då typiskt valt så att hela arrayen får plats i cashminnet.

Användning och jämförelse Heapsort är ofta snabbare och kräver mindre minne men är inte stabil. Quicksort är normalt snabbare för arrayer som får plats i ram-minnet men har ett värsta fall som är O(n 2 ). Mergesort används bla då man sorterar länkade listor där O(n) för att nå ett element saktar ner andra algoritmer. Den fungerar också bra att parallellisera och har den fördelen att den kan sortera en del i taget. Merge kan dessutom användas utan att man behöver tillgång till hela materialet på en gång om stora material måste ligga på tex fil. Mycket vacker enkel algoritm som belysande exempel på rekursion och mera specifikt söndra och härska

Heapsort Heapsort använder en heap för att sortera: Algoritm Sätt in elementen ett efter ett i en heap Ta ut elementen ett efter ett och sätt tillbaka dem i arrayen Men vad är en heap. En heap är ett speciellt sorts binärt träd. Det används för att implementera en prioritetskö och för att utföra heapsort. Låt oss börja med att studera detta träd.

Heap En heap är ett komplett binärt träd där: rotens nyckel är minsta nyckeln i trädet varje icke tomt subträd är en heap

Insättning Algoritm: 1. Sätt in ny nod på första lediga plats 2. Medans noden inte är rot och nodens nyckel är mindre än förälderns nyckel: byt plats på förälder och nod 6 18 29 20 28 39 66 37 26 76 32 74 89 8

Borttagning Vi tar endast bort rot-noden Algoritm 1. Byt ut rotnoden med sista noden i trädet S 2. Så länge S har barn och S har större nyckel än något av sina barn: swappa S med minsta barnet 6 18 8 20 28 39 29 37 26 76 32 74 89 66

Implementering av en heap Eftersom en heap är ett komplett binärt träd är det onödigt att implementera det som en länkad datastruktur. En array fungerar perfekt. Vi lägger helt enkelt nivåerna med elementen i ordning från vänster till höger. En nod med index p har då vänster barn med index 2p+1, höger barn med index 2p+2 och sin förälder med index (p-1)/2. 6 18 8 20 28 39 29 6 18 8 20 28 39 29 37 26 76 32 74 89 66 37 26 76 32 74 89 66

Heapsort Tillbaka till heapsort. Algoritmen: Sätt in elementen ett efter ett i en heap Ta ut elementen ett efter ett och sätt tillbaka dem i arrayen Fungerar bra men har ett problem. Den kräver n extra minne. Detta visar sig onödigt vi kan implementera heapsort utan att använda extra minne. För att kunna använda arrayen som minne ska vi göra en ändring. Vi ska använda en omvänd heap där rotens nyckel är största nyckeln i trädet.

Heapsort inplace heapstorlek = 1 Medans heapstorlek<n e = a[heapstorlek] sätt in e i heapen heapstorlek++ (kan anses ingå i att sätta in) Medans heapstorlek>0 ta bort ett element från heapen och sätt e= detta a[heapstorlek-1]=e heapstorlek-- (kan anses ingå i att ta bort) Läs mer i boken!

Quicksort Får ni läsa in själva från boken. Läs gärna från fler källor. Är den t.ex stabil? Vad är starka och svaga sidor? När används den?

Bucketsort Är ej en jämförelsealgoritm och kan därför vara bättre än O(nlogn). Ide: Säg att vi ska sortera heltal med möjliga värden 0-10000. Vi skapar då en array res med 10001 platser som är nollställda. Sedan kan vi från fil eller array helt enkeltgå igenom materialet och göra res[inläst]++. Den här varianten blir oslagbart effektiv O(n) med den komplikationen att vi måste skapa en för många fall för stor array för att täcka in alla fall (dock kan allt tolkas som heltal). Normalt brukar man med bucketsort använda lite större hinkar (säg 0-9, 10-19, 20-29, osv). Man måste då faktiskt flytta tal till de olika hinkarna och dessutom sedan sortera dessa (med samma metod eller någon annan metod) och sedan flytta tillbaka dem. Titta gärna på pigeonhole sort också

Radixsort LeastSignificantDigit Radix sort: Gruppera talen baserat på den minst signifikanta siffran. Upprepa grupperingen för varje mer signifikant siffra. Grupperingen görs effektivt med bucketsort så att inga jämförelser behövs utan vi behöver endast gå igenom datat en gång per sortering. Läs gärna mer även om denna

Läsanvisning och uppgifter KW 8.1-8.10, 6.5 Uppgifter NB 34 (2p), 35, 36 (1p), 37, 38 (1p), 39 (1p)

Uppgifter NB 34(2p) Skapa en klass Car som innehåller bilmärke, årsmodell och antal körda mil. Klassen ska implementera Comparable<Car> och därmed ha en metod compareto som ska jämföra bilmärke som sträng mellan bilar. a) Skriv ett program som läser in bilar från en textfil till en array och sorterar dessa med hjälp av Java API utifrån metoden compareto. Skriv sedan ut dessa till en ny textfilen. b) Skapa nu en klass CompareCar som implementerar Comparator<Car> och använd denna för att sortera bilarna efter årsmodell istället. Skriv även ut denna ordning men till en annan fil.

NB 35 Implementera urvalssortering och instickssortering för en array av int. NB 36 (1p) Implementera Mergesort för en array av int. Utgå från algoritmerna på föreläsningen. Använd inte kod från boken eller från nätet. NB 37 Implementera Shellsort och Heapsort för en array av int. Utgå från algoritmerna på föreläsningen. Försök att inte använda kod från boken eller från nätet. NB 38 (1p) Implementera Quicksort för en array av int. Titta inte på någon kod utan utgå från algoritmen i boken. NB 39 (1p) Implementera en radix-sort för heltal av typen int. Skriv ett testprogram som slumpar fram en miljon positiva heltal och sedan låter radixsort sortera dessa. Programmet ska sedan gå igenom och kontrollera att sorteringen har fungerat