Sortering
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.2 Sortering Vi hartidligere set at effektiv søgning forudsætter at det datamateriale der skal søges i er sorteret. Også andre typer beregninger på store datamængder kan effektiviseres betragteligt hvis datamængderne er sorteret. Et eksempel er samkøring af tabeller (registre) i databaser. Blandt andet derfor er der brugt mange ressourcer på at finde effektive sorteringsalgoritmer, og det er fortsat et varmt forskningsområde.
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.3 Sortering af en sekvens Nogen gode idéer? s:
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.4 Et hav af sorteringsalgoritmer Indsættelsessortering Udvalgssortering Bobblesortering Flettesortering Heapsortering Shellsortering Bucketsort Combsort Quicksort...
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.5 Indsættelsessortering s: i lokalt sorteret ( ) i = 1; while ( i != s.size() ) { “indsæt s.elementAt(i) i s[0..i]” i++; }
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.6 Udvalgssortering s: i globalt sorteret ( ) i = 0; while ( i != s.size()-1 ) { int m = “indeks for en mindste værdi i s[i..s.size())”; “byt s[i] og s[m]”; i++; } m
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.7 Del, løs og kombinér? P P1P2 L1L2 L L1 = løs(P1)L2 = løs(P2) Del Løs Kombinér
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.8 Løsningselementer Hvad er løsningen på simple problemer Hvordan nedbrydes et problem i (to) delproblemer Hvordan kombineres (to) løsninger til en samlet løsning
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.9 Flettesortering void sort(Sequence s, int l, int h) { // pre: l <= h // post: s[l..h) er sorteret if ( l+1<h ) int m = (l+h)/2; sort(s, l, m); sort(s, m, h); merge(s, l, m, h); } void merge(Sequence s, int i, int j, int k) { // pre: s[i..j) og s[j..k) er sorteret // post: s[i..k) er den totale fletning af // s[i..j) og s[j..k) }
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.10 Quicksort void sort(Sequence s, int l, int h) { // pre: l <= h // post: s[l..h) er sorteret if ( l+1<h ) int p = partition(s, l, h); sort(s, l, p); sort(s, p+1, h); } int partition(Sequence s, int l, int h) { // post: p returneres hvor l <= p < h og // s[l..p) <= s[p] < s[p+1..h) }
Michael E. Caspersen, 2000Introducerende objektorienteret programmeringSortering.11 Quicksort int partition(Sequence s, int l, int h) { // post: p returneres hvor l <= p < h og // s[l..p) <= s[p] < s[p+1..h) int i, j, e; i = l+1; j = h-1; e = s.elementAt(l); while( i<=j ) { if ( s.elementAt(i) <= e ) i++; else if ( s.elementAt(j) > e ) j--; else { swap(i, j); i++; j--; } } swap(l, j); return j; } s: l hij <= e> e?e