Rekursion mit Listen: Quicksort Diskrete Mathematik I Vorlesung 4a Rekursion mit Listen: Quicksort
Übersicht Das Prinzip der Rekursion Beispiel 2: QuickSort 1 Übersicht Das Prinzip der Rekursion Beispiel 2: QuickSort „Teile und Herrsche“ Programmkonstrukte von Java Quicksort: Umsetzung in Java Funktion „QuickSort“
Das Prinzip der Rekursion 2 Das Prinzip der Rekursion Eine rekursive Definition reduziert ein Problem auf ein kleineres Problem derselben Art. Eine rekursive Funktion setzt eine rekursive Definition in ein Programm um.
Beispiel 2: QuickSort einer der schnellsten Sortieralgorithmen 3 Beispiel 2: QuickSort einer der schnellsten Sortieralgorithmen Grundidee: „Teile und Herrsche“ (“divide and conquer“) - ein wichtiges Paradigma für geometrische Algorithmen ein rekursiver Algorithmus mit einer rekursiven Datenstruktur
Sortierliste A mit n Elementen 4 „Teile und Herrsche“ Sortierliste A mit n Elementen Wahl eines Wertes W der Liste A 8x
„Teile und Herrsche“ W Konstruktion einer Partitionierung der Liste A 4 „Teile und Herrsche“ W Konstruktion einer Partitionierung der Liste A 8x
4 „Teile und Herrsche“ K G W alle Elemente von K sind <= W (noch unsortiert) alle Elemente von G sind >= W (noch unsortiert) Sortieren von K und G durch Rekursion A 8x
Funktion „QuickSort“ Liste QuickSort (Liste InList) { 5 Funktion „QuickSort“ Liste QuickSort (Liste InList) { if(InList.IstLeer()) return new Liste(); int W = InList.Kopf().GibWert(); Liste NewInList = InList.Body(); Liste K = NewInList.Kleiner(W); Liste G = NewInList.Groesser(W); Liste K1 = QuickSort(K); Liste G1 = QuickSort(G); K1.FuegeAn(W); K1.Concat(G1); return K1; } lokale Variablen K W G
Methoden der Klasse "Liste" 6 Methoden der Klasse "Liste" class Liste { ................... void FügeAn(int an) {..} boolean IstLeer(){return kopf == null;} Element Kopf() {return kopf;} Liste Body() { Liste NeueListe = new Liste(); NeueListe.kopf = kopf.GibWeiter(); NeueListe.fuß = fuß; return NeueListe;} . Fortsetzung nächste Seite
Methoden der Klasse "Liste" (Fortsetzung) 7 Methoden der Klasse "Liste" (Fortsetzung) Liste Kleiner(int H){ Liste NeueListe = new Liste(); Element zeiger = kopf; while(zeiger != null){ if(zeiger.GibWert() =< H) NeueListe.FügeAn(zeiger.GibWert()); zeiger = zeiger.GibWeiter();} } Liste Groesser(int H){...} void Concat(Liste ZweiteListe){ ... als Übungsaufgabe ....
Methoden der Klasse "Liste" 8 Methoden der Klasse "Liste" Element Kopf(): liefert das erste Element (Kopf) der Liste Liste Body(): liefert Rumpf der Liste Liste Groesser(int v): liefert eine neue Liste mit Elementen, die größer als v sind Liste Kleiner(int v): Liefert eine neue Liste mit Elementen, die kleiner als v sind boolean IstLeer(): liefert true, wenn Liste leer ist, sonst false void FügeAn(int v): fügt ein Element mit dem Wert v am Ende der Liste an void Concat(Liste L): Verbindet die Liste mit der Liste L