Datenstrukturen und Algorithmen

Ähnliche Dokumente
Datenstrukturen und Algorithmen

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Tutoraufgabe 1 (Sortieralgorithmus):

Programmieren I. Kapitel 7. Sortieren und Suchen

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Algorithmen und Datenstrukturen

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

Prof. Dr. Margarita Esponda

Abschnitt: Algorithmendesign und Laufzeitanalyse

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Übung: Algorithmen und Datenstrukturen SS 2007

Grundlagen der Informatik

4. Sortieren 4.1 Vorbemerkungen

Aufgabe (Schreibtischtest, Algorithmenanalyse)

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Kap. 3: Sortieren. Überblick. Unser Sortierproblem. Motivation. Laufzeitmessung. Warum soll ich hier bleiben? Sortierverfahren sind WICHTIG!!!

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

Algorithmen und Datenstrukturen SS09. Foliensatz 15. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Sortieralgorithmen. Inhalt: InsertionSort BubbleSort QuickSort. Marco Block

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

JAVA - Suchen - Sortieren

2 Sortieren durch Vergleichen Eingabefolge a 1, a 2,..., a n 2, 1, 3 Sortieralg. Für festes n ist ein vergleichsbasierter Sortieralg. charakterisiert

Kapitel 6 Elementare Sortieralgorithmen

Komplexität von Algorithmen OOPM, Ralf Lämmel

Ordnen Sie die folgenden Funktionen nach ihrer asymptotischer Komplexität in aufsteigender Reihenfolge: i=1 4i + n = 4 n. i=1 i + 3n = 4 ( n(n+1)

Pro Informatik 2009: Objektorientierte Programmierung Tag 17. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Bucketsort. Korrektheit. Beispiel. Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt.

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Motivation. Vorlesung 10: Binäre Suchbäume

Informatik II, SS 2014

Kapitel 2. Sortieren. Adressenverwaltung (lexikographisch) Treerlisten bei Suchanfragen (Relevanz) Verdeckung (z-koordinate) ...

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Übung Algorithmen und Datenstrukturen

Übung Algorithmen und Datenstrukturen

Grundlagen der Programmierung 2. Sortierverfahren

Suchen und Sortieren

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Pro Informatik 2009: Objektorientierte Programmierung Tag 18. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 1

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Übungsklausur Algorithmen I

Algorithmen und Datenstrukturen. Kapitel 3: Sortierverfahren. Skript zur Vorlesung. Algorithmen und Datenstrukturen

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

7. Sortieren Lernziele. 7. Sortieren

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Übung Algorithmen I

Aufgabenblatt: Arrays

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Spezielle Sortierverfahren Autor: Sven Schuierer

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (25 Sortieren vorsortierter Daten)

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

Inhaltsverzeichnis. Teil 1 Grundlagen 21. Teil 2 Datenstrukturen 85

Datenstrukturen und Algorithmen

Datenstrukturen und Algorithmen

Übung Algorithmen und Datenstrukturen

Sortierverfahren für Felder (Listen)

Algorithmen und Datenstrukturen

4. Algorithmen und Datenstrukturen I Grundlagen der Programmierung 1 (Java)

Algorithmen und Datenstrukturen

1. Aufgabe (6 Punkte): Java-Programmierung (Arrays)

3. Übungsblatt zu Algorithmen I im SoSe 2017

Sortieralgorithmen. Selection Sort

Robert Sedgewick. Algorithmen in Java. Teil 1-4 Grundlagen Datenstrukturen Sortieren Suchen. Java-Beratung durch Michael Schidlowsky

Algorithmen und Datenstrukturen

Kapitel 5: Paradigmen des Algorithmenentwurfs. Gliederung

7. Übung zu Algorithmen I 1. Juni 2016

Name: Seite 2. Beantworten Sie die Fragen in den Aufgaben 1 und 2 mit einer kurzen, prägnanten Antwort.

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Übungsblatt 7. Thema: Sortieren, Objektorientierung

Algorithmenbegriff: Berechenbarkeit. Algorithmenanalyse. (Berechnung der Komplexität)

Kapitel 8 Fortgeschrittene Sortieralgorithmen

Algorithmen und Datenstrukturen 1-3. Seminar -

Robert Sedgewick. Algorithmen in Java. »il 1-4 Grundlagen Datenstrykturen Sortleren Suchen. java-beratung durch Michael Schidlowsky

Übersicht. Datenstrukturen und Algorithmen Vorlesung 5: Rekursionsgleichungen (K4) Übersicht. Binäre Suche. Joost-Pieter Katoen. 20.

Data Structures and Algorithm Design

Übung Algorithmen I

Inhaltsverzeichnis. Teil 1 Grundlagen 23

13. Bäume: effektives Suchen und Sortieren

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Vorlesung Datenstrukturen

Interne Sortierverfahren

Einführung in die Informatik 2

Die Schnittstelle Comparable

Grundlagen: Algorithmen und Datenstrukturen

Sortieralgorithmen. Direkte Sortierverfahren & Shellsort, Quicksort, Heapsort. Vorlesung Algorithmen und Datenstrukturen 2 im SS 2004

Transkript:

Joost-Pieter Katoen Datenstrukturen und Algorithmen 1/33 Datenstrukturen und Algorithmen Vorlesung 7: Sortieren (K2) Joost-Pieter Katoen Lehrstuhl für Informatik 2 Software Modeling and Verification Group http://moves.rwth-aachen.de/teaching/ss-15/dsal/ 30. April 2015

Joost-Pieter Katoen Datenstrukturen und Algorithmen 2/33 Übersicht 1 Sortieren - Einführung Bedeutung des Sortierens Dutch National Flag Problem 2 Sortieren durch Einfügen 3 Mergesort Das Divide-and-Conquer Paradigma Mergesort 4 Effizienteres Sortieren?

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 3/33 Übersicht 1 Sortieren - Einführung Bedeutung des Sortierens Dutch National Flag Problem 2 Sortieren durch Einfügen 3 Mergesort Das Divide-and-Conquer Paradigma Mergesort 4 Effizienteres Sortieren?

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/33 Die Bedeutung des Sortierens Sortieren ist ein wichtiges Thema Sortieren wird häufig benutzt und hat viele Anwendungen. Sortierverfahren geben Ideen, wie man Algorithmen verbessern kann. Geniale und optimale Algorithmen wurden gefunden.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 4/33 Die Bedeutung des Sortierens Sortieren ist ein wichtiges Thema Sortieren wird häufig benutzt und hat viele Anwendungen. Sortierverfahren geben Ideen, wie man Algorithmen verbessern kann. Geniale und optimale Algorithmen wurden gefunden. Neben der Funktionsweise der Algorithmen widmen wir uns vor allem der Laufzeitanalyse.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/33 Anwendungen des Sortierens Beispiel (Suchen) Schnellere Suche ist die wohl häufigste Anwendung des Sortierens. Binäre Suche findet ein Element in O(log n).

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/33 Anwendungen des Sortierens Beispiel (Suchen) Schnellere Suche ist die wohl häufigste Anwendung des Sortierens. Binäre Suche findet ein Element in O(log n). Beispiel (Engstes Paar (closest pair)) Gegeben seien n Zahlen. Finde das Paar mit dem geringstem Abstand.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 5/33 Anwendungen des Sortierens Beispiel (Suchen) Schnellere Suche ist die wohl häufigste Anwendung des Sortierens. Binäre Suche findet ein Element in O(log n). Beispiel (Engstes Paar (closest pair)) Gegeben seien n Zahlen. Finde das Paar mit dem geringstem Abstand. Nach dem Sortieren liegen die Paare nebeneinander. Der Aufwand ist dann noch O(n).

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/33 Noch einige Anwendungen Beispiel (Eigenschaften von Datenobjekten) Sind alle n Elemente einzigartig oder gibt es Duplikate?

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/33 Noch einige Anwendungen Beispiel (Eigenschaften von Datenobjekten) Sind alle n Elemente einzigartig oder gibt es Duplikate? Das k-t größte Element einer Menge?

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 6/33 Noch einige Anwendungen Beispiel (Eigenschaften von Datenobjekten) Sind alle n Elemente einzigartig oder gibt es Duplikate? Das k-t größte Element einer Menge? Beispiel (Textkompression (Entropiekodierung)) Sortiere die Buchstaben nach Häufigkeit des Auftretens um sie dann effizient zu kodieren (d.h. mit möglichst kurzen Bitfolgen).

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 7/33 Sortieren ist nicht trivial! TimSort: Python, Java (OpenJDK + Oracle), Android

Sortieren - Einführung Sortieren ist nicht trivial! TimSort: Python, Java (OpenJDK + Oracle), Android OpenJDK s java.utils.collection.sort() is broken: The good, the bad and the worst case? Stijn de Gouw 1,2, Jurriaan Rot 3,1, Frank S. de Boer 1,3, Richard Bubel 4, and Reiner Hähnle 4 1 CWI, Amsterdam, The Netherlands 2 SDL, Amsterdam, The Netherlands 3 Leiden University, The Netherlands 4 Technische Universität Darmstadt, Germany Abstract. We investigate the correctness of TimSort, which is the main sorting algorithm provided by the Java standard library. The goal is functional verification with mechanical proofs. During our verification attempt we discovered a bug which causes the implementation to crash. We characterize the conditions under which the bug occurs, and from this we derive a bug-free version that does not compromise the performance. We formally specify the new version and mechanically verify the absence of this bug with KeY, a state-of-the-art verification tool for Java. 1 Introduction Joost-Pieter Katoen Some of the arguments often invoked against the usage of formal software verification include the following: it is expensive, it is not worthwhile (compared to its cost), it is less e ective than bug finding (e.g., by testing, static analysis, or model checking), it does not work for real software. In this article we evaluate these arguments in terms of a case study in formal verification. The goal of this paper is functional verification of sorting algorithms written in Java with mechanical proofs. Because of the complexity of the code under verification, it is essential to break down the problem into subtasks of manageable size. This is achieved with contract-based deductive verification [3], where the functionality and the side e ects of each method are precisely specified with expressivedatenstrukturen first-order contracts. und In addition, Algorithmen each class is equipped with an in- 7/33

Sortieren - Einführung Sortieren ist nicht trivial! TimSort: Python, Java (OpenJDK + Oracle), Android OpenJDK s java.utils.collection.sort() is broken: The good, the bad and the worst case? Stijn de Gouw 1,2, Jurriaan Rot 3,1, Frank S. de Boer 1,3, Richard Bubel 4, and Reiner Hähnle 4 1 CWI, Amsterdam, The Netherlands 2 SDL, Amsterdam, The Netherlands 3 Leiden University, The Netherlands 4 Technische Universität Darmstadt, Germany Abstract. We investigate the correctness of TimSort, which is the main sorting algorithm provided by the Java standard library. The goal is functional verification with mechanical proofs. During our verification attempt we discovered a bug which causes the implementation to crash. We characterize the conditions under which the bug occurs, and from this we derive a bug-free version that does not compromise the performance. We formally specify the new version and mechanically verify the absence of this bug with KeY, a state-of-the-art verification tool for Java. 1 Introduction Joost-Pieter Katoen Some of the arguments often invoked against the usage of formal software verification include the following: it is expensive, it is not worthwhile (compared to its cost), it is less e ective than bug finding (e.g., by testing, static analysis, or model checking), it does not work for real software. In this article we evaluate these arguments in terms of a case study in formal verification. The goal of this paper is functional verification of sorting algorithms written in Java with mechanical proofs. Because of the complexity of the code under verification, it is essential to break down the problem into subtasks of manageable size. This is achieved with contract-based deductive verification [3], where the functionality and the side e ects of each method are precisely specified with expressivedatenstrukturen first-order contracts. und In addition, Algorithmen each class is equipped with an in- 7/33

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A. Totale Ordnung Sei A = {a 1,..., a n } eine Menge. Die binäre Relation A A ist eine totale Ordnung (auf A) wenn für alle a i, a j, a k A gilt:

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A. Totale Ordnung Sei A = {a 1,..., a n } eine Menge. Die binäre Relation A A ist eine totale Ordnung (auf A) wenn für alle a i, a j, a k A gilt: 1. Antisymmetrie: a i a j und a j a i impliziert a i = a j.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A. Totale Ordnung Sei A = {a 1,..., a n } eine Menge. Die binäre Relation A A ist eine totale Ordnung (auf A) wenn für alle a i, a j, a k A gilt: 1. Antisymmetrie: a i a j und a j a i impliziert a i = a j. 2. Transitivität: a i a j und a j a k impliziert a i a k.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A. Totale Ordnung Sei A = {a 1,..., a n } eine Menge. Die binäre Relation A A ist eine totale Ordnung (auf A) wenn für alle a i, a j, a k A gilt: 1. Antisymmetrie: a i a j und a j a i impliziert a i = a j. 2. Transitivität: a i a j und a j a k impliziert a i a k. 3. Totalität: a i a j oder a j a i.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/33 Einige Hilfsbegriffe Permutation Eine Permutation einer Menge A = {a 1,..., a n } ist eine bijektive Abbildung π : A A. Totale Ordnung Sei A = {a 1,..., a n } eine Menge. Die binäre Relation A A ist eine totale Ordnung (auf A) wenn für alle a i, a j, a k A gilt: 1. Antisymmetrie: a i a j und a j a i impliziert a i = a j. 2. Transitivität: a i a j und a j a k impliziert a i a k. 3. Totalität: a i a j oder a j a i. Beispiel Die lexikographische Ordnung von Zeichenketten und die numerische Ordnung von Zahlen sind totale Ordnungen.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/33 Sortierproblem Das Sortier-Problem Eingabe: 1. Ein Array E mit n Einträgen. 2. Die Einträge gehören zu einer Menge A mit totaler Ordnung.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/33 Sortierproblem Das Sortier-Problem Eingabe: 1. Ein Array E mit n Einträgen. 2. Die Einträge gehören zu einer Menge A mit totaler Ordnung. Ausgabe: Ein Array F mit n Einträgen, so dass 1. F[1],..., F[n] eine Permutation von E[1],..., E[n] ist

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/33 Sortierproblem Das Sortier-Problem Eingabe: 1. Ein Array E mit n Einträgen. 2. Die Einträge gehören zu einer Menge A mit totaler Ordnung. Ausgabe: Ein Array F mit n Einträgen, so dass 1. F[1],..., F[n] eine Permutation von E[1],..., E[n] ist 2. Für alle 0 < i < n gilt: F[i] F[i+1].

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/33 Sortierproblem Das Sortier-Problem Eingabe: 1. Ein Array E mit n Einträgen. 2. Die Einträge gehören zu einer Menge A mit totaler Ordnung. Ausgabe: Ein Array F mit n Einträgen, so dass 1. F[1],..., F[n] eine Permutation von E[1],..., E[n] ist 2. Für alle 0 < i < n gilt: F[i] F[i+1]. Annahmen dieser Vorlesung Die zu sortierende Sequenz ist als Array organisiert, nicht als Liste. Die Elementaroperation ist ein Vergleich von Schlüsseln.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/33 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort, Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, Cocktailsort, Bogosort uvm.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/33 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort, Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, Cocktailsort, Bogosort uvm. Stabilität Ein Sortieralgorithmus ist stabil wenn er die Reihenfolge der Elemente, deren Sortierschlüssel gleich sind, bewahrt.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/33 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort, Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, Cocktailsort, Bogosort uvm. Stabilität Ein Sortieralgorithmus ist stabil wenn er die Reihenfolge der Elemente, deren Sortierschlüssel gleich sind, bewahrt. Wenn z.b. eine Liste alphabetisch sortierter Personendateien nach dem Geburtsdatum neu sortiert wird, dann bleiben unter einem stabilen Sortierverfahren alle Personen mit gleichem Geburtsdatum alphabetisch sortiert.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 10/33 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort, Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, Cocktailsort, Bogosort uvm. Stabilität Ein Sortieralgorithmus ist stabil wenn er die Reihenfolge der Elemente, deren Sortierschlüssel gleich sind, bewahrt. Wenn z.b. eine Liste alphabetisch sortierter Personendateien nach dem Geburtsdatum neu sortiert wird, dann bleiben unter einem stabilen Sortierverfahren alle Personen mit gleichem Geburtsdatum alphabetisch sortiert. Wir werden erst einen einfachen Sortieralgorithmus betrachten.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 11/33 Dutch National Flag Problem (I)

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 12/33 Dutch National Flag Problem (II) Beispiel (Das niederländische Flaggen-Problem [Dijkstra, 1972]) Eingabe: 1. Ein Array E mit n Einträgen, wobei für alle 0 < i n E[i] == rot, E[i] == blau oder E[i] == weiss 2. Ordnung: rot < weiss < blau

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 12/33 Dutch National Flag Problem (II) Beispiel (Das niederländische Flaggen-Problem [Dijkstra, 1972]) Eingabe: 1. Ein Array E mit n Einträgen, wobei für alle 0 < i n E[i] == rot, E[i] == blau oder E[i] == weiss 2. Ordnung: rot < weiss < blau Ausgabe: Ein sortiertes Array mit den Einträgen aus E.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 12/33 Dutch National Flag Problem (II) Beispiel (Das niederländische Flaggen-Problem [Dijkstra, 1972]) Eingabe: 1. Ein Array E mit n Einträgen, wobei für alle 0 < i n E[i] == rot, E[i] == blau oder E[i] == weiss 2. Ordnung: rot < weiss < blau Ausgabe: Ein sortiertes Array mit den Einträgen aus E. Erwünschte Worst-Case Zeitkomplexität: Θ(n).

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 12/33 Dutch National Flag Problem (II) Beispiel (Das niederländische Flaggen-Problem [Dijkstra, 1972]) Eingabe: 1. Ein Array E mit n Einträgen, wobei für alle 0 < i n E[i] == rot, E[i] == blau oder E[i] == weiss 2. Ordnung: rot < weiss < blau Ausgabe: Ein sortiertes Array mit den Einträgen aus E. Erwünschte Worst-Case Zeitkomplexität: Θ(n). Erwünschte Worst-Case Speicherkomplexität: Θ(1).

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b,

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b, so dass folgende Invariante gilt: 1. E[1],..., E[r] ist die rote Region, d.h. für alle 0 < i r E[i] == rot.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b, so dass folgende Invariante gilt: 1. E[1],..., E[r] ist die rote Region, d.h. für alle 0 < i r E[i] == rot. 2. E[r+1],..., E[u-1] ist die weiße Region, d.h. für alle r < i < u E[i] == weiss.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b, so dass folgende Invariante gilt: 1. E[1],..., E[r] ist die rote Region, d.h. für alle 0 < i r E[i] == rot. 2. E[r+1],..., E[u-1] ist die weiße Region, d.h. für alle r < i < u E[i] == weiss. 3. E[u],..., E[b-1] ist unbekannte Region, d.h. für alle u i < b E[i] == rot oder E[i] == weiss oder E[i] == blau.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b, so dass folgende Invariante gilt: 1. E[1],..., E[r] ist die rote Region, d.h. für alle 0 < i r E[i] == rot. 2. E[r+1],..., E[u-1] ist die weiße Region, d.h. für alle r < i < u E[i] == weiss. 3. E[u],..., E[b-1] ist unbekannte Region, d.h. für alle u i < b E[i] == rot oder E[i] == weiss oder E[i] == blau. 4. E[b],..., E[n] ist die blaue Region, d. h. für alle b i n E[i] == blau.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/33 Dutch National Flag Problem (III) Hauptidee Zerlege das Array E in 4 Regionen: (1) 0 < i r, (2) r < i < u, (3) u i < b, und (4) b i n für die Hilfsvariablen r, u und b, so dass folgende Invariante gilt: 1. E[1],..., E[r] ist die rote Region, d.h. für alle 0 < i r E[i] == rot. 2. E[r+1],..., E[u-1] ist die weiße Region, d.h. für alle r < i < u E[i] == weiss. 3. E[u],..., E[b-1] ist unbekannte Region, d.h. für alle u i < b E[i] == rot oder E[i] == weiss oder E[i] == blau. 4. E[b],..., E[n] ist die blaue Region, d. h. für alle b i n E[i] == blau. Arrayelemente können mit der swap-operation vertauscht werden.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } b

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } b

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } b

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } b

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 die unbekannte Region u = u + 1; // verkleinere 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r u b 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 u = u + 1; // verkleinere die unbekannte Region 9 } 10 if (E[u] == weiss) { 11 u = u + 1; r 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } u b

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 u = u + 1; // verkleinere die unbekannte Region 9 } 10 if (E[u] == weiss) { 11 u = u + 1; 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 }

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 u = u + 1; // verkleinere die unbekannte Region 9 } 10 if (E[u] == weiss) { 11 u = u + 1; 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } Frage: Ist DNF-Algorithmus ein stabiles Sortierverfahren?

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/33 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // rote und blaue Regionen sind leer 3 int u = 1; // weiße Region ist leer, die unbekannte == E 4 while (u < b) { 5 if (E[u] == rot) { 6 swap(e[r + 1], E[u]); 7 r = r + 1; // vergrößere die rote Region 8 u = u + 1; // verkleinere die unbekannte Region 9 } 10 if (E[u] == weiss) { 11 u = u + 1; 12 } 13 if (E[u] == blau) { 14 swap(e[b - 1], E[u]); 15 b = b - 1; // vergrößere die blaue Region 16 } 17 } 18 } Frage: Ist DNF-Algorithmus ein stabiles Sortierverfahren? Antwort: Nein.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/33 Dutch National Flag Problem (V) Speicherkomplexität Die Worst-Case Speicherkomplexität vom DNF-Algorithmus ist Θ(1), da die einzigen extra Variablen r, u und b sind.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/33 Dutch National Flag Problem (V) Speicherkomplexität Die Worst-Case Speicherkomplexität vom DNF-Algorithmus ist Θ(1), da die einzigen extra Variablen r, u und b sind. DNF ist in-place, d. h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/33 Dutch National Flag Problem (V) Speicherkomplexität Die Worst-Case Speicherkomplexität vom DNF-Algorithmus ist Θ(1), da die einzigen extra Variablen r, u und b sind. DNF ist in-place, d. h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz. Zeitkomplexität Betrachte als elementare Operationen Vergleiche der Form E[i] ==... Die Worst-Case Zeitkomplexität ist Θ(n), da:

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/33 Dutch National Flag Problem (V) Speicherkomplexität Die Worst-Case Speicherkomplexität vom DNF-Algorithmus ist Θ(1), da die einzigen extra Variablen r, u und b sind. DNF ist in-place, d. h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz. Zeitkomplexität Betrachte als elementare Operationen Vergleiche der Form E[i] ==... Die Worst-Case Zeitkomplexität ist Θ(n), da: 1. in jedem Durchlauf werden konstant viele Vergleiche durchgeführt

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/33 Dutch National Flag Problem (V) Speicherkomplexität Die Worst-Case Speicherkomplexität vom DNF-Algorithmus ist Θ(1), da die einzigen extra Variablen r, u und b sind. DNF ist in-place, d. h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz. Zeitkomplexität Betrachte als elementare Operationen Vergleiche der Form E[i] ==... Die Worst-Case Zeitkomplexität ist Θ(n), da: 1. in jedem Durchlauf werden konstant viele Vergleiche durchgeführt 2. die Anzahl der Durchläufe ist Θ(n), da in jedem Durchlauf die Größe des unbekannten Gebiets b - u um eins verkleinert wird.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 16/33 Übersicht 1 Sortieren - Einführung Bedeutung des Sortierens Dutch National Flag Problem 2 Sortieren durch Einfügen 3 Mergesort Das Divide-and-Conquer Paradigma Mergesort 4 Effizienteres Sortieren?

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 17/33 Sortieren durch Einfügen Insertionsort

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/33 Sortieren durch Einfügen Insertionsort 0 12 17 17 19 8 25 3 6 69 26 4 2 13 34 41 bereits sortiert noch unsortiert als Nächstes einzusortieren Durchlaufen des (unsortierten) Arrays von links nach rechts.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/33 Sortieren durch Einfügen Insertionsort 0 12 17 17 19 8 25 3 6 69 26 4 2 13 34 41 bereits sortiert noch unsortiert als Nächstes einzusortieren Durchlaufen des (unsortierten) Arrays von links nach rechts. Gehe zum ersten bisher noch nicht berücksichtigte Element.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/33 Sortieren durch Einfügen Insertionsort 0 12 17 17 19 8 25 3 6 69 26 4 2 13 34 41 bereits sortiert noch unsortiert als Nächstes einzusortieren Durchlaufen des (unsortierten) Arrays von links nach rechts. Gehe zum ersten bisher noch nicht berücksichtigte Element. Füge es im sortierten Teil (links) nach elementweisem Vergleichen ein.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/33 Sortieren durch Einfügen Insertionsort 0 12 17 17 19 8 25 3 6 69 26 4 2 13 34 41 bereits sortiert noch unsortiert als Nächstes einzusortieren Durchlaufen des (unsortierten) Arrays von links nach rechts. Gehe zum ersten bisher noch nicht berücksichtigte Element. Füge es im sortierten Teil (links) nach elementweisem Vergleichen ein. Dieser Algorithmus funktioniert auch mit anderen linearen Anordnungen, etwa Listen.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 26 41 17 25 19 17 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 17 26 41 25 19 17 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 17 25 26 41 19 17 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 17 19 25 26 41 17 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 17 17 19 25 26 41 8 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 8 17 17 19 25 26 41 3 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 3 8 17 17 19 25 26 41 6 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 3 6 8 17 17 19 25 26 41 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 3 6 8 17 17 19 25 26 41 69 12 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 3 6 8 12 17 17 19 25 26 41 69 4 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 3 4 6 8 12 17 17 19 25 26 41 69 2 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 2 3 4 6 8 12 17 17 19 25 26 41 69 13 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 2 3 4 6 8 12 13 17 17 19 25 26 41 69 34 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69 0 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 0 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 }

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 } Insertionsort ist in-place, d.h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/33 Insertionsort Animation und Algorithmus 1 void insertionsort(int E[]) { 2 int i,j; 3 for (i = 1; i < E.length; i++) { 4 int v = E[i]; // speichere E[i] 5 for (j = i; j > 0 && E[j-1] > v; j--) { 6 E[j] = E[j-1]; // schiebe Element j-1 nach rechts 7 } 8 E[j] = v; // füge E[i] an der richtigen Stelle ein 9 } 10 } Insertionsort ist in-place, d.h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz. Insertionsort ist stabil, da die Reihenfolge der gleichwertigen Arrayelemente unverändert bleibt.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n)

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt. Es muss mit allen vorhergehenden Elementen verglichen werden.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt. Es muss mit allen vorhergehenden Elementen verglichen werden. Das tritt etwa auf, wenn das Array umgekehrt vorsortiert war.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt. Es muss mit allen vorhergehenden Elementen verglichen werden. Das tritt etwa auf, wenn das Array umgekehrt vorsortiert war. Zum Einsortieren des i-ten Elements sind im schlimmsten Fall i Vergleiche nötig:

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt. Es muss mit allen vorhergehenden Elementen verglichen werden. Das tritt etwa auf, wenn das Array umgekehrt vorsortiert war. Zum Einsortieren des i-ten Elements sind im schlimmsten Fall n 1 i Vergleiche nötig: W (n) = i = i=1

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 20/33 Insertionsort Best- und Worst-Case-Analyse Best-Case Im Best-Case ist das Array bereits sortiert. Pro Element ist daher nur ein Vergleich nötig. Es gilt: B(n) = n 1 Θ(n) Worst-Case Im Worst-Case wird das einzusortierende Element immer ganz vorne eingefügt. Es muss mit allen vorhergehenden Elementen verglichen werden. Das tritt etwa auf, wenn das Array umgekehrt vorsortiert war. Zum Einsortieren des i-ten Elements sind im schlimmsten Fall n 1 i Vergleiche nötig: W (n) = i = n (n 1) 2 Θ(n 2 ) i=1

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 21/33 Insertionsort Average-Case-Analyse (I) Annahmen für die Average-Case-Analyse Alle Permutationen von Elementen treten in gleicher Häufigkeit auf. Die zu sortierenden Elemente sind alle verschieden.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 21/33 Insertionsort Average-Case-Analyse (I) Annahmen für die Average-Case-Analyse Alle Permutationen von Elementen treten in gleicher Häufigkeit auf. Die zu sortierenden Elemente sind alle verschieden. Es gilt: n 1 A(n) = erwartete Anzahl an Vergleichen, um E[i] einzusortieren i=1

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 21/33 Insertionsort Average-Case-Analyse (I) Annahmen für die Average-Case-Analyse Alle Permutationen von Elementen treten in gleicher Häufigkeit auf. Die zu sortierenden Elemente sind alle verschieden. Es gilt: n 1 A(n) = erwartete Anzahl an Vergleichen, um E[i] einzusortieren i=1 Die erwartete Anzahl an Vergleichen, um den richtigen Platz für E[i] zu finden wird dann wie folgt hergeleitet:

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/33 Insertionsort Average-Case-Analyse (II) i { i-tes Element wird Pr an Position j eingefügt j=0 } Anzahl Vergleiche, um E[i] an Position j einzufügen

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/33 Insertionsort Average-Case-Analyse (II) i { i-tes Element wird Pr an Position j eingefügt j=0 = i j=0 1 Anzahl Vergleiche, um E[i] i + 1 an Position j einzufügen } Anzahl Vergleiche, um E[i] an Position j einzufügen E[i] wird an beliebiger Position j mit gleicher W lichkeit eingefügt

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/33 Insertionsort Average-Case-Analyse (II) i { i-tes Element wird Pr an Position j eingefügt j=0 = i j=0 1 Anzahl Vergleiche, um E[i] i + 1 an Position j einzufügen = 1 i + 1 i + 1 i + 1 } i (i j + 1) j=1 Anzahl Vergleiche, um E[i] an Position j einzufügen E[i] wird an beliebiger Position j mit gleicher W lichkeit eingefügt Anzahl Vergleiche, um an Position 0 einzufügen ist i, sonst i j+1.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/33 Insertionsort Average-Case-Analyse (II) i { i-tes Element wird Pr an Position j eingefügt j=0 = i j=0 1 Anzahl Vergleiche, um E[i] i + 1 an Position j einzufügen = 1 i + 1 i + 1 i + 1 = i i + 1 + 1 i + 1 } i (i j + 1) j=1 i j = j=1 Anzahl Vergleiche, um E[i] an Position j einzufügen E[i] wird an beliebiger Position j mit gleicher W lichkeit eingefügt Anzahl Vergleiche, um an Position 0 einzufügen ist i, sonst i j+1. i i + 1 + 1 1 i (i+1) i + 2 Vereinfachen = i 2 + 1 1 i + 1.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 23/33 Insertionsort Average-Case-Analyse (III) Damit gilt für A(n): n 1 ( i A(n) = 2 + 1 1 ) i + 1 i=1

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 23/33 Insertionsort Average-Case-Analyse (III) Damit gilt für A(n): n 1 ( i A(n) = 2 + 1 1 ) i + 1 = i=1 n (n 1) 4 + (n 1) n i=2 1 i Auseinanderziehen und Indexverschiebung

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 23/33 Insertionsort Average-Case-Analyse (III) Damit gilt für A(n): n 1 ( i A(n) = 2 + 1 1 ) i + 1 = = i=1 n (n 1) 4 n (n 1) 4 + (n 1) + n n i=1 1 i n i=2 1 i Auseinanderziehen und Indexverschiebung Verschieben des Summenstarts

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 23/33 Insertionsort Average-Case-Analyse (III) Damit gilt für A(n): n 1 ( i A(n) = 2 + 1 1 ) i + 1 = = A(n) i=1 n (n 1) 4 n (n 1) 4 n (n 1) 4 + (n 1) + n n i=1 1 i n i=2 1 i + n ln n Θ(n 2 ) Auseinanderziehen und Indexverschiebung Verschieben des Summenstarts Harmonische Reihe: n (1/i) ln n i=1

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 24/33 Übersicht 1 Sortieren - Einführung Bedeutung des Sortierens Dutch National Flag Problem 2 Sortieren durch Einfügen 3 Mergesort Das Divide-and-Conquer Paradigma Mergesort 4 Effizienteres Sortieren?

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind. Sie lösen die Teilprobleme rekursiv und kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind. Sie lösen die Teilprobleme rekursiv und kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen. Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene:

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind. Sie lösen die Teilprobleme rekursiv und kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen. Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene: Teile das Problem in eine Anzahl von Teilproblemen auf.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind. Sie lösen die Teilprobleme rekursiv und kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen. Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene: Teile das Problem in eine Anzahl von Teilproblemen auf. Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/33 Divide-and-Conquer Teile-und-Beherrsche Algorithmen (divide-and-conquer) teilen das Problem in mehrere Teilprobleme auf, die dem Ausgangsproblem ähneln, jedoch von kleinerer Größe sind. Sie lösen die Teilprobleme rekursiv und kombinieren diese Lösungen dann, um die Lösung des eigentlichen Problems zu erstellen. Das Paradigma von Teile-und-Beherrsche umfasst 3 Schritte auf jeder Rekursionsebene: Teile das Problem in eine Anzahl von Teilproblemen auf. Beherrsche die Teilprobleme durch rekursives Lösen. Hinreichend kleine Teilprobleme werden direkt gelöst. Verbinde die Lösungen der Teilprobleme zur Lösung des Ausgangsproblems.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 26/33 Mergesort Strategie 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 rekursiv Sortieren Mitte rekursiv Sortieren 3 8 17 17 19 25 26 41 0 2 4 6 12 13 34 69 Verschmelzen 0 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69 Teile das Array in zwei möglichst gleichgroße Hälften. Beherrsche: Sortiere die Teile durch rekursive Mergesort-Aufrufe. Verbinde: Mische je 2 sortierte Teilsequenzen zu einem einzigen, sortierten Array.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 27/33 Mergesort Algorithm 1 void mergesort(int E[], int left, int right) { 2 if (left < right) { 3 int mid = (left + right) / 2; // finde Mitte 4 mergesort(e, left, mid); // sortiere linke Hälfte 5 mergesort(e, mid + 1, right); // sortiere rechte Hälfte 6 // Verschmelzen der sortierten Hälften 7 merge(e, left, mid, right); 8 } 9 } 10 // Aufruf: mergesort(e, 0, E.length-1); Verschmelzen kann man in Linearzeit. Wie?

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 26 17 17 3 6 4 2 0 41 25 19 8 69 12 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 26 41 17 25 17 19 3 8 6 69 4 12 2 13 0 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 26 41 17 25 17 19 3 8 6 69 4 12 2 13 0 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 17 3 4 0 26 41 25 17 19 8 6 69 12 2 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 17 25 3 8 4 6 0 2 26 41 17 19 69 12 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 17 25 26 3 8 17 4 6 12 0 2 13 41 19 69 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 17 25 26 41 3 8 17 19 4 6 12 69 0 2 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 17 25 26 41 3 8 17 19 4 6 12 69 0 2 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 0 17 25 26 41 8 17 19 4 6 12 69 2 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 0 2 17 25 26 41 17 19 4 6 12 69 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 0 2 4 25 26 41 17 19 6 12 69 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 17 0 2 4 6 25 26 41 19 12 69 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 17 19 0 2 4 6 12 25 26 41 69 13 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 17 19 25 0 2 4 6 12 13 26 41 69 34

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 17 19 25 26 0 2 4 6 12 13 34 41 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 41 26 17 25 19 17 8 3 6 69 12 4 2 13 34 0 3 8 17 17 19 25 26 41 0 2 4 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 3 8 17 17 19 25 26 41 0 2 4 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 3 8 17 17 19 25 26 41 2 4 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 8 17 17 19 25 26 41 4 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 8 17 17 19 25 26 41 4 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 8 17 17 19 25 26 41 6 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 17 17 19 25 26 41 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 17 17 19 25 26 41 12 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 17 17 19 25 26 41 13 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 41 34 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 28/33 Mergesort Animation 0 2 3 4 6 8 12 13 17 17 19 25 26 34 41 69

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 29/33 Mergesort Verschmelzen in Linearzeit 1 void merge(int E[], int left, int mid, int right) { 2 int a = left, b = mid + 1; 3 int Eold[] = E; 4 for (; left <= right; left++) { 5 if (a > mid) { // Wir wissen (Widerspruch): b <= right 6 E[left] = Eold[b]; 7 b++; 8 } else if (b > right Eold[a] <= Eold[b]) { // stabil: <= 9 E[left] = Eold[a]; 10 a++; 11 } else { // Eold[a] > Eold[b] 12 E[left] = Eold[b]; 13 b++; 14 } 15 } 16 }

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 30/33 Mergesort Analyse Worst-Case Wir erhalten: W (n) = W ( n/2 ) + W ( n/2 ) + n 1 mit W (1) = 0.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 30/33 Mergesort Analyse Worst-Case Wir erhalten: W (n) = W ( n/2 ) + W ( n/2 ) + n 1 mit W (1) = 0. Mit Hilfe des Mastertheorems ergibt sich: W (n) Θ(n log n).

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 30/33 Mergesort Analyse Worst-Case Wir erhalten: W (n) = W ( n/2 ) + W ( n/2 ) + n 1 mit W (1) = 0. Mit Hilfe des Mastertheorems ergibt sich: W (n) Θ(n log n). Best-Case, Average-Case Das Worst-Case-Ergebnis gilt genauso im Best-Case, und damit auch im Average-Case: W (n) = B(n) = A(n) Θ(n log n).

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 30/33 Mergesort Analyse Worst-Case Wir erhalten: W (n) = W ( n/2 ) + W ( n/2 ) + n 1 mit W (1) = 0. Mit Hilfe des Mastertheorems ergibt sich: W (n) Θ(n log n). Best-Case, Average-Case Das Worst-Case-Ergebnis gilt genauso im Best-Case, und damit auch im Average-Case: W (n) = B(n) = A(n) Θ(n log n). Speicherbedarf Θ(n) für die Kopie des Arrays beim Mergen. Θ(log n) für den Stack.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 30/33 Mergesort Analyse Worst-Case Wir erhalten: W (n) = W ( n/2 ) + W ( n/2 ) + n 1 mit W (1) = 0. Mit Hilfe des Mastertheorems ergibt sich: W (n) Θ(n log n). Best-Case, Average-Case Das Worst-Case-Ergebnis gilt genauso im Best-Case, und damit auch im Average-Case: W (n) = B(n) = A(n) Θ(n log n). Speicherbedarf Θ(n) für die Kopie des Arrays beim Mergen. Θ(log n) für den Stack. Mergesort ist nicht in-place. Mit zusätzlichen Verschiebungen ist die Kopie des Arrays nicht nötig.

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 31/33 Übersicht 1 Sortieren - Einführung Bedeutung des Sortierens Dutch National Flag Problem 2 Sortieren durch Einfügen 3 Mergesort Das Divide-and-Conquer Paradigma Mergesort 4 Effizienteres Sortieren?

Effizienteres Sortieren? Wie effizient kann man sortieren? (I) Ja E[2] < E[3]? Ja Nein E[1] < E[2]? Nein E[1] < E[3]? Ja Nein E[1] < E[3]? Ja Nein E[2] < E[3]? Ja Nein Betrachte vergleichsbasierte Sortieralgorithmen als Entscheidungsbaum: Dieser beschreibt die Abfolge der durchgeführten Vergleiche. Sortieren verschiedener Eingabepermutationen ergibt also verschiedene Pfade im Baum. Joost-Pieter Katoen Datenstrukturen und Algorithmen 32/33

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 33/33 Wie effizient kann man sortieren? (II) Theorem Vergleichsbasiertes Sortieren benötigt im Worst-Case mindestens O(n log n) Vergleiche. Beweis. Es gilt:

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 33/33 Wie effizient kann man sortieren? (II) Theorem Vergleichsbasiertes Sortieren benötigt im Worst-Case mindestens O(n log n) Vergleiche. Beweis. Es gilt: Anzahl Vergleiche im Worst-Case = Länge des längsten Pfades = Baumhöhe k.

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 33/33 Wie effizient kann man sortieren? (II) Theorem Vergleichsbasiertes Sortieren benötigt im Worst-Case mindestens O(n log n) Vergleiche. Beweis. Es gilt: Anzahl Vergleiche im Worst-Case = Länge des längsten Pfades = Baumhöhe k. Da wir binäre Vergleiche verwenden, ergibt sich ein Binärbaum mit n! Blättern.

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 33/33 Wie effizient kann man sortieren? (II) Theorem Vergleichsbasiertes Sortieren benötigt im Worst-Case mindestens O(n log n) Vergleiche. Beweis. Es gilt: Anzahl Vergleiche im Worst-Case = Länge des längsten Pfades = Baumhöhe k. Da wir binäre Vergleiche verwenden, ergibt sich ein Binärbaum mit n! Blättern. Mit n! 2 k erhält man k log(n!) Vergleiche im Worst-Case.

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 33/33 Wie effizient kann man sortieren? (II) Theorem Vergleichsbasiertes Sortieren benötigt im Worst-Case mindestens O(n log n) Vergleiche. Beweis. Es gilt: Anzahl Vergleiche im Worst-Case = Länge des längsten Pfades = Baumhöhe k. Da wir binäre Vergleiche verwenden, ergibt sich ein Binärbaum mit n! Blättern. Mit n! 2 k erhält man k log(n!) Vergleiche im Worst-Case. Da log(n!) n log n 1.4 n geht es nicht besser als O(n log n)!