FÖRELÄSNING 12 DATALOGI I



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

SORTERING OCH SÖKNING

Laboration 13, Arrayer och objekt

Föreläsning 11 Datastrukturer (DAT037)

Föreläsning 11 Innehåll

Föreläsning 12 Innehåll

Föreläsning 12 Innehåll

Datastrukturer D. Föreläsning 2

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

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

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

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

OOP Objekt-orienterad programmering

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen OOP

OOP Objekt-orienterad programmering

Föreläsning 9. Sortering

OOP Omtenta

Objektorienterad programmering D2

FÖRELÄSNING 11 DATALOGI I

Sökning och sortering

Programexempel: tärningsspel

Tentamen i Objektorienterad programmering

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

OOP Objekt-orienterad programmering

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

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

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

OOP Tentamen

Föreläsning 5: Rekursion

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

OOP Omtenta

Algoritmer. Två gränssnitt

Lösningar för tenta 3 DAT043,

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

Lathund, procent med bråk, åk 8

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

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

Distribuerade system. CORBA eller RMI

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Sortering. Om du följt dessa steg korrekt så ska böckerna nu vara sorterade.

Sätt att skriva ut binärträd

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

PROG2 Tenta Gäller SP:PROG2, DSK2:PROG2, FK:PROG2, FK:OOP, DSV1:P2 och ITK:P2

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

OOP Tenta

Tentamen i Programmering grundkurs och Programmering C

Tentamen Datastrukturer D DAT 036/DIT960

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

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Datastrukturer. föreläsning 2

Föreläsning REPETITION & EXTENTA

Grundläggande programmering med C# 7,5 högskolepoäng

Objektsamlingar i Java

DAT043 - föreläsning 8

Arrayer (fält)

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

DELPROV 1 I DATAVETENSKAP

Objektorienterad programmering med Java, Generics

Objektorienterad programmering i Java

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

DAT043 Objektorienterad Programmering

Idag: Dataabstraktion

Innehåll. Sökning och hashtabeller. En bilsamling att söka i. En bil-klass att söka efter. Hur hittar vi alla bilar som uppfyller ett annat villkor

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

Föreläsning 13. Rekursion

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 12: Exempel och problemlösning

Avsikt På ett lekfullt sätt färdighetsträna, utveckla elevers känsla för hur vårt talsystem är uppbyggt samt hitta mönster som uppkommer.

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

LÖSNINGSFÖRSLAG

Tentamen, EDAA20/EDA501 Programmering

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

Föreläsning 8: Räkning. Duvhålsprincipen. Kombinatorik

Föreläsning 8: Exempel och problemlösning

Ha det kul med att förmedla och utveckla ett knepigt område!

Algebra, polynom & andragradsekvationer en pampig rubrik på ett annars relativt obetydligt dokument

PROGRAMMERING A VB6 UTVECKLINGSVERKTYGET VISUAL BASIC

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

Dugga Datastrukturer (DAT036)

Programmering A. Johan Eliasson

Magnus Nielsen, IDA, Linköpings universitet

Föreläsning 1, vecka 7: Rekursion

Skriva B gammalt nationellt prov

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Snabbslumpade uppgifter från flera moment.

OOP Objekt-orienterad programmering

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 27 maj 2008

Malmö högskola 2007/2008 Teknik och samhälle

Tentamen. Programmeringsmetodik, KV: Java och OOP. 17 januari 2002

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

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

Lösningar för tenta 2 DAT043,

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

OOP Objekt-orienterad programmering

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

Tentamen. Lösningsförslag

Transkript:

Föreläsning 12 2I1027 1 FÖRELÄSNING 12 DATALOGI I Sortering Beatrice Åkerblom beatrice@dsv.su.se Institutionen för Data- och Systemvetenskap SU/KTH

Föreläsning 12 2I1027 2 Läsanvisningar Michael Main Data Structures & Other Objects Using Java (Upplaga: Second Edition), Addison Wesley, 2003, ISBN : 0-201-74093-1 Sortering kapitel 12

Föreläsning 12 2I1027 3 Olika sorteringsalgoritmer Selection Sort Insertion Sort Merge Sort Quick Sort Att sortera objekt Generella sorteringsmetoder Något om Generics i Java Föreläsningens innehåll

Föreläsning 12 2I1027 4 Exempel Vi har en array med heltal som ska sorteras int[]test = new int[15]; // Arrayen fylls med värden Sorteringen utförs i en metod som får arrayen som ska sorteras som argument: void selectionsort(int[]arr){ // metodens kropp int-arrayer av olika längd kan skickas till metoden! Var lägger vi metoden selectionsort??

Föreläsning 12 2I1027 5 Exempel, forts. Vi skapar en klass som innehåller de olika sorteringsmetoderna: class Sort{ public static void selectionsort(int[]arr){ // Metod-kroppen public static void insertionsort(int[]arr){ // Metod-kroppen Då metoderna är statiska kan vi smidigt anropa dem: int[]test = new int[100]; // Arrayen fylls med värden Sort.selectionSort(test);

Föreläsning 12 2I1027 6 Selection sort 19 23 8 17 82 36 43 4 61 12 Leta upp minsta värdet Byt plats på minsta och första 4 23 8 17 82 36 43 19 61 12 Första rutan är sorterad Leta upp minsta i resten av arrayen Byt med första osorterade 4 8 23 17 82 36 43 19 61 12 Fortsätt på samma sätt med resten 4 8 12 17 19 23 36 43 61 82

Föreläsning 12 2I1027 7 Selection sort 19 23 8 17 82 36 43 4 61 12 void selectionsort(int[]arr){ for (int x=0; x<arr.length-1; x++){ int min=x; for (int y=x+1; y<arr.length; y++) if (arr[y]<arr[min]) min=y; int temp=arr[x]; arr[x]=arr[min]; arr[min]=temp;

Föreläsning 12 2I1027 8 Insertion sort 19 23 8 17 82 36 43 4 61 12 Den första rutan är sorterad Tag den andra, lägg in den på rätt plats 8 19 23 17 82 36 43 4 61 12 Tag den tredje, lägg in den på rätt plats 8 17 19 23 82 36 43 4 61 12 Tag den fjärde, lägg in den på rätt plats 8 17 19 23 82 36 43 4 61 12 Fortsätt tills alla blivit insorterade

Föreläsning 12 2I1027 9 Insertion sort 19 23 8 17 82 36 43 4 61 12 void insertionsort(int[]arr){ for (int x=1; x<arr.length; x++){ int temp=arr[x], y=x; while (y>0 && arr[y-1]>temp){ arr[y]=arr[y-1]; y--; arr[y]=temp;

Föreläsning 12 2I1027 10 Merge sort 19 23 8 17 82 36 43 4 61 12 Dela upp arryen i två (lika stora) delar: 19 23 8 17 82 36 43 4 61 12 Sortera varje del 8 17 19 23 82 4 12 36 61 43 Slå ihop (merge) de två sorterade subarrayerna 4 8 12 17 19 23 36 43 61 82

Föreläsning 12 2I1027 11 Merge sort 19 23 8 17 36 4 61 12 19 23 8 17 36 4 61 12 19 23 8 17 36 4 61 12 19 23 8 17 36 4 61 12 19 23 8 17 4 36 12 61 8 17 19 23 4 12 36 61 4 8 12 17 19 23 36 61

Föreläsning 12 2I1027 12 Merge sort 19 23 8 17 82 36 43 4 61 12 void mergesort(int[]arr, int start, int stopp){ if (start<stopp){ int mitt=(start+stopp)/2; mergesort(arr, start, mitt); mergesort(arr, mitt+1, stopp); merge(arr, start, mitt, mitt+1, stopp);

Föreläsning 12 2I1027 13 Merge sort 19 23 8 17 82 36 43 4 61 12 void merge(int[]arr, int start1, int stopp1, int start2, int stopp2){ int[]sub1=new int[stopp1-start1+1], sub2=new int[stopp2-start2+1]; System.arraycopy(arr, start1, sub1, 0, sub1.length); System.arraycopy(arr, start2, sub2, 0, sub2.length); int s1=0, s2=0, a=start1; while (s1<sub1.length && s2<sub2.length) if (sub1[s1]<sub2[s2]) arr[a++]=sub1[s1++]; else arr[a++]=sub2[s2++]; while (s1<sub1.length) arr[a++]=sub1[s1++]; while (s2<sub2.length) arr[a++]=sub2[s2++];

Föreläsning 12 2I1027 14 Merge sort i klassen Sort, version I class Sort{ public static void mergesort(int[]arr, int start, int stopp){ //Metod-kroppen private static void merge(int[]arr, int start1, int stopp1, int start2, int stopp2){ //Metod-kroppen Anropet blir då: int[]test = new int[100]; //Arrayen fylls med värden Sort.mergeSort(test, 0, test.length-1);

Föreläsning 12 2I1027 15 Merge sort i klassen Sort, version II class Sort{ public static void mergesort(int[]arr){ mergesort(arr, 0, arr.length-1); public static void mergesort(int[]arr, int start, int stopp){ //Metod-kroppen private static void merge(int[]arr, int start1, int stopp1, int start2, int stopp2){ //Metod-kroppen Anropet blir då: int[]test = new int[100]; //Arrayen fylls med värden Sort.mergeSort(test);

Föreläsning 12 2I1027 16 Quick sort 19 23 8 17 82 36 43 4 61 12 Välj ett mittvärde (pivot-punkt), t. ex. första värdet Lägg alla mindre än pivot-värdet i början, större på slutet 8 17 4 12 19 23 82 36 43 61 Pivot-värdet ligger på rätt plats Sortera de mindre samt sortera de större Och voilà - den är sorterad! 4 8 12 17 19 23 36 43 61 82

Föreläsning 12 2I1027 17 Quick sort 13 45 18 11 63 14 21 43 11 13 18 45 63 14 21 43 11 14 18 45 63 21 43 14 21 43 45 63 21 43 63 43 11 13 14 18 21 43 45 63

Föreläsning 12 2I1027 18 Quick sort 19 23 8 17 82 36 43 4 61 12 void quicksort(int[]arr, int start, int stopp){ if (start<stopp){ int pivot=delaupp(arr,start,stopp); quicksort(arr,start,pivot-1); quicksort(arr,pivot+1,stopp);

Föreläsning 12 2I1027 19 Quick sort 19 23 8 17 82 36 43 4 61 12 int delaupp(int[]arr, int start, int stopp){ int pivotvalue=arr[start]; int pivot=start; for (int x=start+1; x<=stopp; x++) if (arr[x]<pivotvalue){ int temp=arr[x]; arr[x]=arr[++pivot]; arr[pivot]=temp; arr[start]=arr[pivot]; arr[pivot]=pivotvalue; return pivot;

Föreläsning 12 2I1027 20 Mer om sortering mergesort & quicksort snabbare än selectionsort & insertionsort Om arrayen redan är sorterad - insertionsort snabbast mergesort & quicksort s.k. Divide-and-Conquer algoritmer (Dela upp i två delar, Besegra (här sortera) de två delarna rekursivt) mergesort skapar två delarrayer dit värden måste kopieras. Detta kostar utrymme + tid varför quicksort räknas som snabbast mergesort & quicksort kan snabbas upp genom att om intervallet som skall sorteras är mindre än 7 stort - använd insertionsort quicksort - valet av pivot-värde flaskhals. En variant är att ta medianen av första, sista och mittersta värdet.

Föreläsning 12 2I1027 21 Sortera objekt Hittills har int-arrayer används (för enkelhets skull). Om man vill sortera en array med objekt då?? class Hund{ private String namn; private int age, vikt; public Hund(String n, int a, int v){ namn=n; age=a; vikt=v; public String getnamn(){ return namn; public int getage(){ return age;

Föreläsning 12 2I1027 22 Sortera hund-objekt Sortera en array med Hund-objekt ( Hund[] ) i åldersordning, yngsta hunden först: void selectionsort(hund[]arr){ for (int x=0; x<arr.length-1; x++){ int min=x; for (int y=x+1; y<arr.length; y++) if (arr[y].getage()<arr[min].getage()) min=y; Hund temp=arr[x]; arr[x]=arr[min]; arr[min]=temp;

Föreläsning 12 2I1027 23 Sortera hund-objekt Sortera en array med Hund-objekt ( Hund[] ) i bokstavsordning med avseende på hundarnas namn: void selectionsort(hund[]arr){ for (int x=0; x<arr.length-1; x++){ int min=x; for (int y=x+1; y<arr.length; y++) if (arr[y].getnamn().compareto(arr[min].getnamn())<0) min=y; Hund temp=arr[x]; arr[x]=arr[min]; arr[min]=temp;

Föreläsning 12 2I1027 24 Sortera vad som helst En generell sorteringsmetod, gäller för vilka objekt som helst! void selectionsort(object[]arr){ for (int x=0; x<arr.length-1; x++){ int min=x; for (int y=x+1; y<arr.length; y++) if (arr[y].??? <arr[min].??? ) min=y; Object temp=arr[x]; arr[x]=arr[min]; arr[min]=temp; Hur ska vi kunna jämföra två objekt - vi vet ju INTE vilken sorts objekt det är? Ibland hundar, en annan gång bilar... Vi måste skicka en jämförelse-metod till sorteringsmetoden

Föreläsning 12 2I1027 25 Sortera vad som helst Det vi i Java kan skicka är ett objekt. Detta objekt måste då innehålla metoden som jämför två objekt (t ex två Hundar). Hur kan vi få kompilatorn att fatta detta? Jo vi tvingar det objekt som skall skickas till sorteringsmetoden att implementera gränssnittet (interfacet) Comparator. I java.util-delbiblioteket finns: interface Comparator{ public int compare(object o1, Objekt o2); //Om o1 < o2 returneras ett negativt tal //Om o1 och o2 är lika returneras noll //om o1 > o2 returneras ett positivt tal

Föreläsning 12 2I1027 26 Comparator Vi ser nu till att ta emot ett Comparator-objekt i vår sorteringsmetod. I detta objekt VET vi nu att metoden compare finns och att den anger sorteringsordningen. Vår generella selectionsort: (OBS överst: import java.util.*; ) void selectionsort(object[]arr; Comparator comp){ for (int x=0; x<arr.length-1; x++){ int min=x; for (int y=x+1; y<arr.length; y++) if (comp.compare(arr[y], arr[min])<0) min=y; Object temp=arr[x]; arr[x]=arr[min]; arr[min]=temp;

Föreläsning 12 2I1027 27 Sortera hund-objekt igen Om vi till exempel vill sortera ett antal hundar i åldersordning: class HundSort implements Comparator{ public int compare(object o1, Object o2){ Hund h1=(hund)o1, h2=(hund)o2; int tal=h1.getage()-h2.getage(); return tal; ---- Hund[]alla = new Hund[100]; //Arrayen fylls med Hund-objekt HundSort hs = new HundSort(); Sort.selectionSort(alla, hs); //alternativt: Sort.selectionSort(alla, new HundSort());

Föreläsning 12 2I1027 28 Sortera bil-objekt Vi har Bilar som bland annat har årsmodell och pris. Vi vill sortera bilarna i första hand på årsmodell, i andra hand på pris. class Bil{ private int year, pris; public int getyear(){ return year; public int getpris(){ return pris; class HurSorteraBilar implements Comparator{ public int compare(object o1, Object o2){ Bil b1=(bil)o1, b2=(bil)o2; int tal=b1.getyear()-b2.getyear(); if (tal==0) return b1.getpris()-b2.getpris(); else return tal;

Föreläsning 12 2I1027 29 Sortera bil-objekt, forts. Bil[]allaBilar = new Bil[10000]; //Arrayen fylls med bilar Sort.selectionSort(allaBilar, new HurSorteraBilar());