Sortieralgorithmen Greedy Sortieren: Sortieren durch Auswahl, Einfügen und Austauschen Divide-and-Conquer-Sortieren: Quicksort und merge sort Foliensatz.

Slides:



Advertisements
Ähnliche Präsentationen
Algorithmen und Datenstrukturen
Advertisements

Hash-Tabellen und -Funktionen Hash-Tabellen in Java
Rekursion: Rekurrenz: Algorithmen rufen sich selbst (rekursiv) auf.
DNA-Array oder DNA-Chip
DNA-Array oder DNA-Chip
Informatik II – Kapitel 11
Sortieren I - Bubblesort -
WS 03/041 Algorithmentheorie 01 - Einleitung Prof. Dr. S. Albers Prof. Dr. Th. Ottmann.
Einführung in die Programmierung Zusammenfassung
Foliensatz von A. Weber zur Vorlesung Informatik I, Bonn, 2002/03
Lineare Suche Divide-and-Conquer-Suche Kombinationssuche
„Such-Algorithmen“ Zusammenfassung des Kapitels 11
Kapitel 6: Klassifizierung von Sortiertechniken
G.Heyer Algorithmen und Datenstrukturen II 1 Algorithmen und Datenstrukturen II Wintersemester 2000 / 2001 Prof. Dr. Gerhard Heyer Institut für Informatik.
Kapitel 7. Sortier-Algorithmen
Kapitel 6. Suchverfahren
Kapitel 3: Listen Lineare Liste: endliche Folge von Elementen eines Grundtyps (n>=0), leere Liste falls n=0 Listenelemente besitzen.
5. Sortier-Algorithmen Vorbemerkungen:
Sortierverfahren Richard Göbel.
Listen Richard Göbel.
Sortierverfahren Richard Göbel.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (04 – Entwurfsverfahren) Prof. Th. Ottmann.
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (08 - Einfache Sortierverfahren) Prof. Th. Ottmann.
WS Algorithmentheorie 01 – Divide and Conquer (Segmentschnitt) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (10 - Suchverfahren) T. Lauer.
Algorithmen und Datenstrukturen
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Algorithmen und Datenstrukturen
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 4 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Algorithmen und Datenstrukturen
WS 06/07 Algorithmentheorie 01 - Einleitung Prof. Dr. Th. Ottmann Tobias Lauer.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (03 – Verschiedene Algorithmen für dasselbe Problem) Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (09 - Weitere Sortierverfahren) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Geometrisches Divide and Conquer

Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
Vortrag: Ingo Gensch, Mathias Reich am:
Bubbelsort und Quicksort Vortrag von Rolf Heitzenröder
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Rekursion mit Listen: Quicksort
4 Sortierverfahren 4.1 Einführung 4.2 Naive Sortierverfahren
Merge-Sort und Binäres Suchen /10D. Haehn Populäres algorithmisches Lösungsverfahren Populäres algorithmisches Lösungsverfahren Divide: Problem.
Computational Thinking Suchen und Sortieren [Ordnung muss sein…]
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Sortieralgorithmen Sortieren von Arrays.
Einführung in die Programmierung
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
2.4 Rekursion Klassifikation und Beispiele
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Grundlegende Sortieralgorithmen
Selection-Sort Insertion-Sort Bubble-Sort.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Rekursion-
M a r c – o l i v e r p a h l Informatik II – Kapitel 12 „Sortier-Algorithmen“ Zusammenfassung des Kapitel 12 Küchlin, Weber, Einführung in die Informatik,
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
Sortierverfahren Mit VB 2010 express edition JBS Tr, info Q1.
Suchen und Sortieren.
 Präsentation transkript:

Sortieralgorithmen Greedy Sortieren: Sortieren durch Auswahl, Einfügen und Austauschen Divide-and-Conquer-Sortieren: Quicksort und merge sort Foliensatz von Prof. D. Saupe, Uni Konstanz, 2003. Überarbeitet und ergänzt von A. Weber, sowie von W. Küchlin zu Informatik II, Tübingen 2004 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -1- Springer-Verlag, ISBN 3-540-20958-1

Einleitung und Problemstellung Aufgabe: Sortiere Folge F aufsteigend (bzw. absteigend) Klassifikation elementarer Sortierverfahren greedy divide-and-conquer Implementierungen basieren auf Folgen als Reihungen (arrays) Listen (linked lists) Wichtige Gesichtspunkte: Laufzeitkomplexität (asymptotisch) Speicherplatz: Bei Reihungen Operationen „in place“ bevorzugt Bei jeder Rekursion Platz für Parameter und Variablen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -2- Springer-Verlag, ISBN 3-540-20958-1

Aufgabe: Überführe unsortierte Folge F in sortierte Folge S. Reihungen vs. Listen Aufgabe: Überführe unsortierte Folge F in sortierte Folge S. Implementierung von F, S als Listen Vorteil: Elemente von F nach S bewegen durch Umketten (kein zusätzlicher Speicher) Nachteil: kein wahlfreier Zugriff (random access) Implementierung von F, S als Reihung (array) Vorteil: wahlfreier Zugriff Nachteil: Schrumpfen von F und Wachsen von S zunächst nicht trivial, bei naiver Lösung zeit- und speicheraufwändig W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -3- Springer-Verlag, ISBN 3-540-20958-1

Grundprinzipien elementarer Sortierverfahren: Greedy Sortieren durch Auswahl (selection sort) Finde in F kleinstes Element und füge es an das Ende von S an. Sortieren durch Einfügen (insertion sort) Nehme erstes Element aus F und füge es an richtiger Stelle in S ein. Sortieren durch Austauschen (bubble sort) Gehe von links nach rechts durch F und vertausche benachbarte Elemente, falls falsch geordnet. Wiederhole den Schritt, bis Folge fertig sortiert. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -4- Springer-Verlag, ISBN 3-540-20958-1

Grundprinzipien elementarer Sortierverfahren: divide-and-conquer Quicksort Teile F in Teilfolgen F1, F2, wobei Elemente in F1 kleiner als Elemente in F2 sind. Sortiere F1, F2 rekursiv Füge sortierte Teilfolgen zusammen. Sortieren durch Mischen (merge sort) Teile F in Teilfolgen F1, F2 Bilde S durch iteratives Anhängen des kleineren der jeweils ersten Elemente aus F1, F2 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -5- Springer-Verlag, ISBN 3-540-20958-1

Einordnung elementarer Sortierverfahren Implementierung array list greedy selection sort bubble sort insertion sort divide-and-conquer quicksort merge sort W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -6- Springer-Verlag, ISBN 3-540-20958-1

Generische Implementierung von Sortierverfahren Algorithmen „parametrisiert“ durch Vergleichsoperator Interface Comparable im Paket java.lang Aufruf Vergleichsmethode a.compareTo(b) liefert Zahl <0, = 0, >0 für a<b, a=b, a>b Muster für Objekte vom Referenztyp Comparable public class MyObject implements Comparable { MyType data; public int compareTo (MyObject obj) { if („this.data < obj.data“) return -1; if („this.data = obj.data“) return 0; if („this.data > obj.data“) return 1; } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -7- Springer-Verlag, ISBN 3-540-20958-1

Generische Implementierung von Sortierverfahren Muster für Aufruf in Klassenmethode (hier bei Suchverfahren): public static int binarySearch( Comparable[] f, Comparable a, int l, int r) { int p = (l+r)/2; int c = f[p].compareTo(a); ... W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -8- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: Sortieren durch Auswahl Prinzip: Solange es Elemente in der Folge F gibt, finde in F das kleinste Element und überführe es ans Ende der Folge S. Je nachdem, ob man mit select ein minimales oder maximales Element auswählt, erhält man eine schwach aufsteigend oder schwach absteigend sortierte Folge S. SelectSort (F) // Die unsortierte Folge F wird in die sortierte Folge S überführt. 1. Initialisiere: S = . 2. Trivialfall: if (F == ) return (S) 3. Reduktion: Minimum aus S nach F überführen. a = select (F) S = appendElem (S,a); F = deleteElem (F,a); 4. Iteriere: Weiter bei 2. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -9- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: Beispiel Sortiere F0 = (21, 5, 3, 1, 17) schwach aufsteigend wähle jeweils Minimum in F S0 = () F0 = (21, 5, 3, 1, 17) S1 = (1) F1 = (21, 5, 3, 17) S2 = (1, 3) F2 = (21, 5, 17) S3 = (1, 3, 5) F3 = (21, 17) S4 = (1, 3, 5, 17) F4 = (21) S5 = (1, 3, 5, 17, 21) F5 = () W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -10- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: Listenimplementierung public class MyObject implements Comparable . . . public class Node Object data; Node next; public class OrderedList  private Node head; public OrderedList sort ( ) . . . W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -11- Springer-Verlag, ISBN 3-540-20958-1

Interne Hilfsmethoden int findMin () . . . F.findMin() bestimmt Index des minimalen Elements von OrderedList F void insertLast (int a) S.insertLast(a) fügt Element mit Index a an das Ende von S an void deleteElem (int a) F.deleteElem(a) löscht Element mit Index a aus Liste F Aufwand jeweils = O(n), wenn n = Anzahl der Objekte in Liste W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -12- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: Beispielimplementierung public class OrderedList { // ... /** * Gibt Liste zurück, die die Elemente von this * in nicht absteigend sortierter Reihenfolge enthält. * Methode ist als selection sort implementiert. */ public OrderedList selectSort() { int min; OrderedList newList = new OrderedList(); while( head != null ) // Liste ist nicht leer { min = findMin(); newList.insertLast(min); deleteElem(min); } return (newList); Komplexität: n Iterationen der while-Schleife mit je O(n) Aufwand ergibt insgesamt O(n2) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -13- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: Array Implementierung I Reihung data0, ..., datan-1 partitioniert in sortierter Anfang S: data0, ..., datanext-1 unsortierter Rest F: datanext, ..., datan-1 Finde Index min des minimalen Elementes in F Vertausche datanext mit datamin Inkrementiere next und iteriere solange next<n S wächst nach rechts, F schmilzt von links ab. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -14- Springer-Verlag, ISBN 3-540-20958-1

Selection sort: array Implementierung II public class OrderedArray { // ... Comparable[] data; void selectSort() { int min; // Initialize // Reduce F and grow S for (int next = 0; next < data.length-1; next++) { min = findMin(next,data.length-1); swap(next,min); } findMin(i,j) berechnet Index des minimalen Elementes in datai, ..., dataj swap(i,j) vertauscht datai mit dataj W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -15- Springer-Verlag, ISBN 3-540-20958-1

Insertion sort: Sortieren durch Einfügen Nehme jeweils das erste Element aus F und füge es in S an der richtigen Stelle ein. InsertSort(F) // Die unsortierte Folge F wird in die sortierte Folge S überführt. 1. Initialisiere: S =  2. Trivialfall: if (F == ) return(S). 3. Reduziere F : ein Element aus F sortiert nach S überführen. a = takeFirst(F); S = insertSorted(S,a); 4. Iteriere: Weiter bei 2. Zur Implementierung: F.takeFirst() bestimmt das erste Element aus F und löscht es anschließend aus F, S.insertSorted(a) fügt Element a in S an der richtigen Stelle ein. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -16- Springer-Verlag, ISBN 3-540-20958-1

Insertion sort: Beispiel S0 = () F0 = (21, 5, 3, 1, 17) S1 = (21) F1 = (5, 3, 1, 17) S2 = (5, 21) F2 = (3, 1, 17) S3 = (3, 5, 21) F3 = (1, 17) S4 = (1, 3, 5, 21) F4 = (17) S5 = (1, 3, 5, 17, 21) F5 = () W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -17- Springer-Verlag, ISBN 3-540-20958-1

Insertion sort: listenbasiert public class OrderedList { // ... /** * Gibt Liste zurück, die die Elemente von this * in nicht absteigend sortierter Reihenfolge enthält. * Methode ist als insertion sort implementiert. */ public OrderedList insertSort() { Comparable first; OrderedList resList; while( head!=null ) // Liste ist nicht leer { first = takeFirst(); resList.insertSorted(first); } return resList; Komplexität: O(n2) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -18- Springer-Verlag, ISBN 3-540-20958-1

Insertion sort: arraybasiert Reihung data0, ...,  n-1 partitioniert in sortierter Anfang S: data0, ..., datanext-1 unsortierter Rest F: datanext, ..., datan-1 Wähle Element datanext zum Einfügen Suche Einfügestelle absteigend von next-1 bis 0 Schiebe dabei jedes zu große Element eine Position nach hinten bis Einfügestelle gefunden W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -19- Springer-Verlag, ISBN 3-540-20958-1

bubble sort: Sortieren durch Austauschen Geht man von links nach rechts durch eine Folge F und vertauscht alle benachbarten Elemente, welche falsch geordnet sind, so steht am Schluss das größte Element von F am Ende der Folge. Das größte Element steigt dabei in der Folge wie eine Blase nach oben (bubble sort). Diesen Durchgang wiederholt man mit dem Rest der Folge F, bis die ganze Folge geordnet ist. S bildet sich also rechts von F und dehnt sich nach links aus. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -20- Springer-Verlag, ISBN 3-540-20958-1

bubble sort: Beispiel F0 = (21, 5, 3, 1, 17) S0 = () F1 = (5, 3, 1, 17) S1 = (21) F2 = (3, 1, 5) S2 = (17, 21) F3 = (1, 3) S3 = (5, 17, 21) F4 = (1) S4 = (3, 5, 17, 21) F5 = () S5 = (1, 3, 5, 17, 21) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -21- Springer-Verlag, ISBN 3-540-20958-1

Bubble sort: Arrayimplementierung public class OrderedArray { Comparable[] data; // array of data // ... /** * Swaps the contents of data[i] and data[j]. */ void swap(int i, int j) { Comparable tmp = data[i]; data[i]=data[j]; data[j]=tmp; } * Sorts the array data in ascending order. public void bubbleSort() { for(int j = data.length-1; j > 0; j--) for( int i = 1; i <= j; i++) // compare element at position j in sorted list // move greatest up if( data[i-1].compareTo(data[i]) > 0 ) swap(i-1,i); Komplexität: O(n2) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -22- Springer-Verlag, ISBN 3-540-20958-1

divide-and-conquer: Prinzip Das abstrakte Divide-and-Conquer-Prinzip sieht folgendermaßen aus: 1. Teile das Problem (divide). 2. Löse die Teilprobleme (conquer). 3. Kombiniere die Teillösungen (join). Beim Sortieren gibt es zwei Ausprägungen: Hard split / easy join: Dabei wird die gesamte Arbeit beim Teilen des Problems verrichtet und die Kombination ist trivial, das heißt, F wird so in F1 und F 2 partitioniert, daß S = S1 S2. Dieses Prinzip führt zum Quicksort-Algorithmus. Easy split / hard join: Dabei ist die Aufteilung F = F1 F2 trivial und die ganze Arbeit liegt beim Zusammensetzen von S1 und S2 zu S. Dieses Prinzip führt zum Mergesort-Algorithmus. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -23- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Allgemeines Einer der besten und meist genutzten Sortieralgorithmen Hauptvorteile: sortiert Array in place O(n log n) Komplexität im Mittel O(log n) zusätzlicher Speicherplatz auf Stack in Praxis schneller als andere Verfahren mit derselben asymptotischen Komplexität O(n log n) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -24- Springer-Verlag, ISBN 3-540-20958-1

Wähle und entferne Pivotelement p aus F quick sort: Prinzip Wähle und entferne Pivotelement p aus F Zerlege F in Teilfolgen F1, F2 so dass e1 < p ≤ e2 für alle e1 in F1, e2 in F2 Sortiere (rekursiv) F1 zu S1 und F2 zu S2 Gesamtlösung ist S1 p S2 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -25- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Zerlegung in Teilfolgen Für Zerlegung in F1, F2 ist p mit jedem Element von F \ {p} zu vergleichen Zerlegung soll durch Vertauschen von Elementen geschehen (kein Zusatzspeicher, in place!) Wähle p als rechtes Randelement von F Suche i = arg mini Fi ≥ p, j = arg maxj Fj < p Paar Fi, Fj „steht falsch“, also vertausche Fi mit Fj Terminierung (ohne Vertauschen!), wenn erstmals i > j, sonst gehe zum Suchschritt 4 Vertausche p mit linkem Rand von F2 (also mit Fi) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -26- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Wahl des Pivotelements Algorithmus ist schnell, wenn die Teilfolgen F1, F2 etwa gleich groß sind Im schlimmsten Fall ist eine Teilfolge immer leer (kann vorkommen, wenn Folge vorsortiert ist) Daher wählt man häufig p als Median von drei Stichproben, z. B. erstes, mittleres und letztes Element von F (b ist Median von a,b,c, wenn a ≤ b ≤ c) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -27- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Beispiel (9, 7, 1, 6, 2, 3, 8, 4 ) (9, 7, 1, 6, 2, 3, 8), ( 4 ) (3, 7, 1, 6, 2, 9, 8), ( 4 ) (3, 2, 1, 6, 7, 9, 8), ( 4 ) (3, 2, 1, 4, 7, 9, 8, 6 ) Nun ist die 4 am richtigen Platz angelangt. Danach geht es weiter mit dem rekursiven Aufruf auf den beiden Teilfolgen: F1 = (3, 2, 1) und F2 = (7, 9, 8, 6) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -28- Springer-Verlag, ISBN 3-540-20958-1

quick sort: Java Implementierung I/II public class OrderedArray { Comparable[] data; // array of data // ... /** * Sorts data[l], data[l+1], ... , data[r] * in ascending order using the quicksort algorithm * Precondition: 0 <= l <= r < data.length. */ public void quickSort(int l, int r) { // 0. Initialisiere int i = l, j = r-1; // 1. Check auf Trivialfall if (l >= r) return; // Initialisiere pivot Comparable pivot = data[r]; // 2. Teile: Füge pivot an einem Platz p in F (=data), // ein, so dass F[i]<F[p] für l<=i<p und // F[j] >= F[p] für p<=j<=r. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -29- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Java Implementierung II // 2.1 Finde äusserstes ungeordnetes Paar F[i], F[j], // i<j, mit F[i] >= pivot und F[j] < pivot und // F[s] < pivot für l<=s<i und F[s] >= pivot // für j<s<=r. while( data[i].compareTo(pivot) < 0 ) i++; while( j>=l && data[j].compareTo(pivot) >= 0) j--; // 2.2 Ordne Paar; finde nächstes ungeordnetes Paar. while( i < j ) { // i<j impliziert j>=l, // daher F[j]<pivot und F[i]>=pivot. swap(i,j); while( data[j].compareTo(pivot) >= 0 ) j--; } // 2.3 Endgültiger Platz für pivot ist i: es gilt i>j // (und nicht nur i>=j, denn i=j impliziert // pivot<=F[i]<pivot) und F[k]<pivot f¨ur 0<=k<i; // F[k]>=pivot für j<k<=r; wegen i>j folgt // F[k]>=pivot für i<=k<=r. swap(i,r); // 3. Herrsche: Sortiere links und rechts // vom Ausgangspunkt. quickSort(l, i-1); quickSort(i+1, r); W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -30- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Komplexität I Anzahl der Vergleiche T(n), n = Länge der Eingabe Auf jeder Rekursionsebene sind O(n) Vergleiche von Datenelementen zu machen (genaue Zahl hängt ab von der Anzahl der swap-Operationen) Maximale Anzahl von Rekursionsebenen ist n (alle Folgenelemente sind kleiner als Pivotelement) Im schlimmsten Fall also O(n2) Vergleiche W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -31- Springer-Verlag, ISBN 3-540-20958-1

quicksort: Komplexität II Im besten Fall sind Teilfolgen gleich groß und ungefähre Rechnung für n = 2k ergibt Tbest(n) Tbest(2k) = n + 2 Tbest (2k-1)) = = n + 2 · n/2 + 4 · Tbest(2k-2) = n + n + 4 Tbest(2k-2) = ··· = n + n + ···+ n + 2k · Tbest (1) = k·n + 2k · Tbest (1) = k · n + n · c = n log2n +cn  O(n logn) Komplexität im Mittel ebenfalls O(n log n). (Beweis siehe z.B. in Ottmann/Widmayer) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -32- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Sortieren durch Mischen Sehr gut geeignet für Folgen in Listenform Für Arrays problematisch (O(n) zusätzlicher Speicherplatz) Komplexität auch im schlimmsten Fall O(n log n) Bei merge sort wird die Folge F einfach in zwei gleich große Hälften F1 und F2 geteilt, F = F1 F2. Teilfolgen F1 und F2 werden rekursiv sortiert mit Ergebnis S1 und S2. Die sortierten Folgen S1 und S2 werden dann in einem linearen Durchgang zur sortierten Folge S gemischt, indem man das jeweils kleinste (bzw. größte) Element von S1 und S2 an S anfügt. W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -33- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Beispiel (3, 2, 1, 7, 3, 4, 9, 2) (3, 2, 1, 7, 3, 4, 9, 2) (3, 2, 1, 7),(3, 4, 9, 2) (3, 2), (1, 7),(3, 4), (9, 2) (3),(2), (1),(7),(3),(4),(9),(2) (2, 3), (1, 7),(3, 4) (2, 9) (1, 2, 3, 7) (2, 3, 4, 9) (1, 2, 2, 3, 3, 4, 7, 9) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -34- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Java Implementierung I public class OrderedList { OrderedNode head; int length; // ... /** * Sorts this list in non-descending order. * Works destructively on the encapsulated * node chain starting with head. * Implemented as merge sort. */ public void mergeSort() { OrderedList aList, bList; // the divided lists OrderedNode aChain; // start of first node chain OrderedNode bChain; // start of second node chain OrderedNode tmp; // working node for split // trivial cases if( (head==null) || // empty list (head.next == null) ) // one element list return; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -35- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Java Implementierung II // divide: split the list in two parts aChain = head; tmp = head; // init working node for split // advance half of the list for (int i=0; i < (length-1) / 2; i++) tmp=tmp.next; // cut chain into aChain and bChain bChain=tmp.next; tmp.next=null; // encapsulate the two node chains in two lists aList = new OrderedList(); aList.head=aChain; aList.length=length/2; bList = new OrderedList(); bList.head=bChain; bList.length=length - alist.length; // conquer: recursion aList.mergeSort(); bList.mergeSort(); // join: merge merge(aList, bList); } } W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -36- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Anmerkungen Aus Gründen der Übersichtlichkeit erzeugt dieses Programm im Divide-Schritt jeweils gekapselte Zwischenlisten vom Typ OrderedList. In der Praxis würde man hierauf verzichten und rein auf Knoten-Ketten arbeiten, da insgesamt O(n) Objekte vom Typ OrderedList erzeugt und wieder vernichtet werden (maximal O(log n) davon sind gleichzeitig aktiv). W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -37- Springer-Verlag, ISBN 3-540-20958-1

merge sort: Komplexität Zähle nur Vergleiche bei Länge n = 2k Split: n/2 Schritte (bewege Node tmp in die Mitte) Merge: n Vergleiche Rekursionsebenen: log2 n Gesamtkomplexität: O(n log2n) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -38- Springer-Verlag, ISBN 3-540-20958-1