Datenstrukturen und Algorithmen

Ähnliche Dokumente
Datenstrukturen und Algorithmen

Übersicht. Datenstrukturen und Algorithmen. Die Bedeutung des Sortierens. Übersicht. Vorlesung 6: Sortieren (K2)

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

Tutoraufgabe 1 (Sortieralgorithmus):

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

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

Grundlagen: Algorithmen und Datenstrukturen

Abschnitt: Algorithmendesign und Laufzeitanalyse

3.2. Divide-and-Conquer-Methoden

Algorithmen und Datenstrukturen

Übersicht 1 Suchalgorithmen. Übersicht

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

Datenstrukturen & Algorithmen

Sortieren II / HeapSort Heaps

Prof. Dr. Margarita Esponda

Algorithmen und Datenstrukturen

Sortieralgorithmen OOPM, Ralf Lämmel

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

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

Programmieren I. Kapitel 7. Sortieren und Suchen

Mergesort. Idee. Die folgende Funktion mergesort sortiert eine Folge a vom unteren Index lo bis zum oberen Index hi.

Grundlagen der Informatik

Elementare Sortierverfahren

4. Sortieren 4.1 Vorbemerkungen

Informatik II Sortieren

Algorithms & Data Structures 2

Abschnitt 19: Sortierverfahren

Aufgabe (Schreibtischtest, Algorithmenanalyse)

Übung: Algorithmen und Datenstrukturen SS 2007

Datenstrukturen & Algorithmen

Algorithmen und Datenstrukturen 1

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

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

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!!!

JAVA - Suchen - Sortieren

Übung Algorithmen und Datenstrukturen

Grundlagen der Programmierung 2. Sortierverfahren

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Algorithmen und Datenstrukturen

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

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

Vorlesung Datenstrukturen

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Übersicht. Einfache Verfahren MergeSort Untere Schranke QuickSort Selektieren Schnelleres Sortieren Externes Sortieren. 6 Sortieren.

A3.1 Sortieralgorithmen

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

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit ** i=1

Kapitel 3: Sortierverfahren Gliederung

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Algorithmen und Datenstrukturen

Kapitel 6 Elementare Sortieralgorithmen

Mergesort. Inhaltsverzeichnis. Veranschaulichung der Funktionsweise. aus Wikipedia, der freien Enzyklopädie

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

(08 - Einfache Sortierverfahren)

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

Klausur Algorithmen und Datenstrukturen SS August Arbeitszeit 90 min

Algorithmen und Datenstrukturen 12

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

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

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

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Klausur Datenstrukturen und Algorithmen SoSe 2012

Übungsklausur Algorithmen I

Abgabe: (vor der Vorlesung) Aufgabe 3.1 (P) Master-Theorem

Übersicht Datenstrukturen und Algorithmen. Literatur. Algorithmus: Wikipedia Definition. Vorlesung 1: Einführung. Prof. Dr.

Heapsort. Erstellung eines Heaps

Heapsort. 1. Erstelle aus dem gegebenen Array einen Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Einführung in die Informatik Algorithmen und Datenstrukturen. Thema 17 Sortieren

Aufgabe (Schreibtischtest, lexikographische Ordnung)

Übungsklausur Algorithmen I

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

Algorithmen und Datenstrukturen

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Algorithmen und Datenstrukturen (für ET/IT)

Transkript:

Joost-Pieter Katoen Datenstrukturen und Algorithmen 1/32 Datenstrukturen und Algorithmen Vorlesung 7: Sortieren (K2) Joost-Pieter Katoen Lehrstuhl für Informatik 2 Software Modeling and Verification Group http://www-i2.rwth-aachen.de/i2/dsal10/ 7. Mai 2010

Joost-Pieter Katoen Datenstrukturen und Algorithmen 2/32 Ü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/32 Ü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/32 Die Bedeutung des Sortierens Sortieren ist ein wichtiges Thema Sortiert 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/32 Die Bedeutung des Sortierens Sortieren ist ein wichtiges Thema Sortiert 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/32 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/32 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/32 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/32 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/32 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/32 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 7/32 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 7/32 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 7/32 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 7/32 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 7/32 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 8/32 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 8/32 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 8/32 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, j < n gilt: F[i] F[i+1].

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 8/32 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, j < 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 9/32 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, usw.

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 9/32 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, usw. 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 9/32 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, usw. 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 9/32 Sortieralgorithmen Beispiel (Einige Sortieralgorithmen) Insertionsort, Bubblesort, Shellsort, Mergesort, Heapsort Quicksort, Countingsort, Bucketsort, Radixsort, Stoogesort, usw. 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 10/32 Dutch National Flag Problem (I)

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 11/32 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 11/32 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 11/32 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 11/32 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 12/32 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 12/32 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 12/32 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 12/32 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 die 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 12/32 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 die 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 12/32 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 die 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 13/32 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 } Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/32

Sortieren - Einführung Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 der DNF-Algorithmus ein stabiles Sortierverfahren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/32

Sortieren - Einführung Dutch National Flag Problem (IV) 1 void DutchNationalFlag(Color E[], int n) { 2 int r = 0, b = n + 1; // die rote und blaue Region sind leer 3 int u = 1; // die unbekannte Region == 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 der DNF-Algorithmus ein stabiles Sortierverfahren? Antwort: Nein. Joost-Pieter Katoen Datenstrukturen und Algorithmen 13/32

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/32 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 14/32 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 14/32 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 Operation die Vergleiche der Form E[i] ==.... Die Worst-Case Zeitkomplexität ist Θ(n), da:

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/32 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 Operation die Vergleiche der Form E[i] ==.... Die Worst-Case Zeitkomplexität ist Θ(n), da: 1. in jedem Durchlauf werden eine konstante Anzahl Vergleiche durchgeführt

Sortieren - Einführung Joost-Pieter Katoen Datenstrukturen und Algorithmen 14/32 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 Operation die Vergleiche der Form E[i] ==.... Die Worst-Case Zeitkomplexität ist Θ(n), da: 1. in jedem Durchlauf werden eine konstante Anzahl Vergleiche durchgeführt 2. die Anzahl der Durchläufe ist Θ(n), da in jedem Durchlauf die Größe vom unbekannten Gebiet b - u um eins verkleinert wird.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 15/32 Ü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 16/32 Sortieren durch Einfügen Insertionsort

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 17/32 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 17/32 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 17/32 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 17/32 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 lineare Anordnungen, etwa Listen.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/32 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 18/32 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 } Insertionsort ist in-place, d. h. der Algorithmus arbeitet ohne zusätzlichen Speicherplatz.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 18/32 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 } 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 19/32 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 19/32 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 19/32 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 19/32 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 19/32 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 musste mit allen vorhergehenden Elementen verglichen werden.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 19/32 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 musste 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 19/32 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 musste 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 19/32 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 musste 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 19/32 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 musste 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 20/32 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 20/32 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 20/32 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 21/32 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 21/32 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 21/32 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 oder 1 einzufügen ist i, sonst i j+1.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 21/32 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=0 Anzahl Vergleiche, um E[i] an Position j einzufügen i i + 1 + 1 1 i i+1 i + 2 E[i] wird an beliebiger Position j mit gleicher W lichkeit eingefügt Anzahl Vergleiche, um an Position 0 oder 1 einzufügen ist i, sonst i j+1. Vereinfachen = i 2 + 1 1 i + 1.

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/32 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 22/32 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

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/32 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 Verschieben des Summenstarts

Sortieren durch Einfügen Joost-Pieter Katoen Datenstrukturen und Algorithmen 22/32 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 Verschieben des Summenstarts Harmonische Reihe: n (1/i) ln n i=1

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 23/32 Ü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 24/32 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 24/32 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 24/32 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 24/32 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 24/32 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 24/32 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 Ausgangsproblem.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 25/32 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 die 2 sortierte Teilsequenzen zu einem einzigen, sortierten Array.

Mergesort Joost-Pieter Katoen Datenstrukturen und Algorithmen 26/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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 27/32 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/32 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 29/32 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 29/32 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 29/32 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 29/32 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 30/32 Ü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 31/32

Effizienteres Sortieren? Joost-Pieter Katoen Datenstrukturen und Algorithmen 32/32 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 32/32 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 32/32 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 32/32 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 32/32 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)!