Programmering 1999 Forelæsning 18, fredag 5 november 1999 Anvendelse af udvalgssortering Quicksort Rapportopgave Programmering 1999 KVL Side 18-1 Eksempel 2 på anvendelse af udvalgssortering Sortering af poster En fødselsdagskalender 19640627 Carsten 19470206 Niels 19031001 Edith 19660106 Carsten 19070206 Ingeborg 19360114 Kirsten 19360630 Henrik 19551202 Harald 19340930 Jørgen 19641209 Hanne Man kan enten sortere efter alder (fødselsdag eller navn Programmering 1999 KVL Side 18-2 Hvordan repræsentere poster i Java Lav en klasse Person med to felter class Person int date; String name; En Person har navn og fødselsdag Person p1 = new Person(; p1date = 19640627; p1name = "Carsten"; Programmering 1999 KVL Side 18-3 Sortering af personer Metode swap skal kunne ombytte personer private static void swap(person[] arr, int s, int t Person tmp = arr[s]; arr[s] = arr[t]; arr[t] = tmp; Metode udvsort skal kunne sammenligne personer (feks på fødselsdag public static void selsort(person[] arr, int n /* pp1 */ for (int i = 0; i < n; i++ /* pp2 */ int least = i; for (int j = i+1; j < n; j++ if (arr[j]date < arr[least]date least = j; swap(arr, i, least; /* pp3 */ /* pp4 */ Programmering 1999 KVL Side 18-4
Indlæsning af personer fra tekstfil public static int readfile(person[] arr, String filename throws FileNotFoundException, IOException int n = 0; Reader inp = new FileReader(filename; StreamTokenizer tstream = new StreamTokenizer(inp; tstreamparsenumbers(; tstreamnexttoken(; while (n < arrlength && tstreamttype!= StreamTokenizerTT_EOF arr[n]date = (inttstreamnval; tstreamnexttoken(; arr[n]name = tstreamsval; tstreamnexttoken(; n++; return n; Programmering 1999 KVL Side 18-5 Hovedprogram Indlæs, sorter og udskriv public static void main(string[] args throws FileNotFoundException, IOException Person[] people = new Person[100]; for (int i=0; i<peoplelength; i++ people[i] = new Person(; int n = readfile(people, "birthdaytxt"; selsort(people, n; printout(people, n; Programmering 1999 KVL Side 18-6 Programmering 1999 KVL Side 18-8 Helt små problemer En tabel med 0 eller 1 element er allerede sorteret Del og hersk Opdel i mindre problemer og løs dem hver for sig Rekursiv Sortering af tabel kræver sortering af deltabeller Kombinér til sorteret hele Sortér hver gruppe for sig Opdel ne i to grupper små og store Grundidé i Quicksort Programmering 1999 KVL Side 18-7 emærk at udregning af rfak(n forudsætter udregning af rfak(n-1; metoden rfak kalder sig selv static int rfak(int n if (n == 0 return 1; else return n * rfak(n - 1; Den kan også programmeres rekursivt i Java hvis hvis Fakultetsfunktionen kan defineres rekursivt således Repetition Rekursive funktioner, fakultetsfunktionen
! Programmering 1999 KVL Side 18-10 Fortsæt opdelingen indtil Ombyt ne ved og, så de kommer på plads Stop når fundet venstre-element og højre-element Gennemløb tabellen fra venstre ( og højre ( samtidig Opdelingsfasen Programmering 1999 KVL Side 18-9 Sortér venstre og højre del hver for sig Opdeling Flyt til venstre; til højre?? Vælg et element fra tabellen pivotelementet Hvis, så Hvis så er tabellen allerede sorteret (trivielt delproblem Quicksort for en tabel Programmering 1999 KVL Side 18-12 ( * er, dvs asymptotisk proportional med * "# $&% Værste tilfælde for Quicksort Programmering 1999 KVL Side 18-11 Ialt ca runder Sidste runde een sortering med 1 element Tredje runde een sortering med Anden runde een sortering med Værste tilfælde altid skæv opdeling Opdelingsfasen kræver ca sammenligninger Tidsforbrug for sortering af
( 6 ; => < 87? 9 4 4 Programmering 1999 KVL Side 18-14 Quicksort er meget hurtig i praksis Gennemsnitlige tilfælde også er, dvs asymptotisk proportional med led 5 3 3 2tilfælde edste for Quicksort Programmering 1999 KVL Side 18-13 Højst runder, da antal halveres hver gang Sidste runde sorteringer med hver 1 element Tredje runde fire sorteringer med hver Anden runde to sorteringer med hver hvis Heldigste tilfælde en opdeling og derefter to heldige sorteringer edste tilfælde altid ligelig opdeling Hjælpemetoden ombyt Ombyt ne i @og A static void swap(int[] arr, int s, int t int tmp = arr[s]; arr[s] = arr[t]; arr[t] = tmp; Programmering 1999 KVL Side 18-15 private static void qsort(int[] arr, int a, int b // sort the subtable arr[ab] if (a < b int i = a, j = b; int x = arr[(i+j / 2]; /* pp1 */ do /* pp2 */ while (arr[i] < x i++; /* pp3 */ while (arr[j] > x j--; /* pp4 */ if (i <= j swap(arr, i, j; i++; j--; /* pp5 */ while (i <= j; /* pp6 */ qsort(arr, a, j; /* pp7 */ qsort(arr, i, b; /* pp8 */ /* pp9 */ Programmering 1999 KVL Side 18-16
Programmering 1999 KVL Side 18-18 Ellers er og vi har ved pp1 OK at metoden bare returnerer Enten er, og så har nul eller ét element Men så er allerede sorteret Det er derfor Der er to muligheder arbejdsområde for qsort(arr, a, b Vi kigger derfor kun på dette område (røres ikke arbejdsområde for qsort(arr, a, b (røres ikke 0 Et kald qsort(arr, a, b berører kun ne Invarianter for quicksort Programmering 1999 KVL Side 18-17 public static void quicksort(int[] arr, int n qsort(arr, 0, n-1; Sorter hele tabellen ved at kalde qsort Quicksort Programmering 1999 KVL Side 18-20 Men så er hele tabelafsnittet jo sorteret! Ved pp8 og pp9, efter kaldet qsort(arr, i, b Ved pp7, efter kaldet qsort(arr, a, j Ved pp6, når løkken er stoppet, gælder Programmering 1999 KVL Side 18-19 Ved pp5, efter ombytning Ved pp4, efter j-løkken Ved pp3, efter i-løkken Ved pp2
og Programmering 1999 KVL Side 18-22 Løkkeinvarianter hjælper til at forstå effektive løkker de simplere problemer løses ved rekursive kald et komplekst problem løses ved opdeling i simplere problemer Quicksort bygger på del-og-hersk De ekstreme tilfælde er sjældne Quicksort kan være langsom i ekstreme tilfælde Quicksort er meget hurtig i praksis, langt hurtigere end udvalgssortering Husk Læs noterne Searching and sorting with Java, side 19 24 Programmering 1999 KVL Side 18-21 Øjebliksbilleder kan altså give hurtigere programmer I praksis bidrager det væsentligt til quicksorts effektivitet Øjebliksbillederne gør det muligt at undvære indekstjek i de indre løkker Alle senere gange følger det af pp5 idet og derfor Første gang følger det af pp1 med C Hvordan ved vi at de indre løkker stopper? while (arr[i] < x i++; De indre løkker Rapportopgave Form Enkeltvis eller i grupper på 2 4 personer Indhold Helst noget fra jeres studier (eller fritidsinteresser Eksempler Web-baseret reservation af grupperum Spil, feks tetris eller minestryger Matching og sammenkædning af DNA-sekvenser Simulering af en blandet bøge/aske-skov Automatisk generering af optimeringsproblem ud fra bevoksningsliste At generere, vise, og løse en 3-dimensional labyrint eregning af stammesidelinier og vedmasse ud fra givne parametre Simulering af svinebesætning (drægtighed, faring Simulering af malkekvægsbesæetning (kælvning, mælkeydelse, udskiftning Simulering af stoftransport i jord Visualisering af vækstmodeller for danske træarter Udarbejdelse af webside og appletter med undervisningsmæssigt formål Programmering 1999 KVL Side 18-23 Rapportstruktur Forord Indledning aggrund og problemstilling rugervejledning og eksempel Teknisk beskrivelse af programmet Afprøvning Konklusion Rettesnor for sidetal (enmandsopgave/4, 1, 2, 2, 2, 2, 1/2 side Skøn over programlængde 2 5 sider (Et kort program er bedre end et langt der gør det samme Programmering 1999 KVL Side 18-24