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

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

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT)

1 Einführung. 2 Grundlagen von Algorithmen. 3 Grundlagen von Datenstrukturen. 4 Grundlagen der Korrektheit von Algorithmen

Algorithmen und Datenstrukturen

1 Raumwechsel: Gr. 15 (Do 10-12, F-235) ab sofort in G Studie zum Arbeitsverhalten von Studierenden unter Leitung

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (für ET/IT)

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

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

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

Informatik II, SS 2016

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

Datenstrukturen und Algorithmen

Kapitel 6 Elementare Sortieralgorithmen

Abschnitt: Algorithmendesign und Laufzeitanalyse

Algorithmen und Datenstrukturen

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Kapitel 5: Paradigmen des Algorithmenentwurfs. Gliederung

Übung Algorithmen und Datenstrukturen

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

G. Zachmann Clausthal University, Germany Die wichtigsten Entwurfsverfahren für Algorithmen:

Kap. 3: Sortieren. 4. VO DAP2 SS April 2009

Technische Universität München SoSe 2018 Fakultät für Informatik, I Mai 2018 Dr. Stefanie Demirci

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

Übung Algorithmen I

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

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Suchen. Lineare Suche. Such-Algorithmen. Sommersemester Dr.

Abschnitt 19: Sortierverfahren

Algorithmen und Datenstrukturen

Informatik II, SS 2018

Informatik II, SS 2018

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Definition Algorithmus. Wie beschreibt man Algorithmen?

Kapitel 2. Weitere Beispiele Effizienter Algorithmen

Algorithmen und Datenstrukturen (für ET/IT)

Technische Universität München SoSe 2015 Institut für Informatik I Mai 2015 Dr. Tobias Lasser. Aufgabe 1 Rechnen mit Landau-Symbolen

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Klausur Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013)

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

Sortieralgorithmen. Selection Sort

Suchen und Sortieren Sortieren. Mergesort

Übung Algorithmen und Datenstrukturen

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

3.2. Divide-and-Conquer-Methoden

Datenstrukturen und Algorithmen

Programmiertechnik II

Divide & Conquer. Problem in Teilprobleme aufteilen Teilprobleme rekursiv lösen Lösung aus Teillösungen zusammensetzen

Einführung in die Informatik 2

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

Informatik II, SS 2016

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

Übung Algorithmen I

Formaler. Gegeben: Elementfolge s = e 1,...,e n. s ist Permutation von s e 1 e n für eine lineare Ordnung ` '

Das Divide - and - Conquer Prinzip. Quicksort Formulierung und Analyse des Prinzips Geometrisches Divide and Conquer - Closest-Pair - Segmentschnitt

Algorithmen und Datenstrukturen

Sortieren & Co. KIT Institut für Theoretische Informatik

Übung Algorithmen und Datenstrukturen

Datenstrukturen & Algorithmen

19. Dynamic Programming I

Wiederholung. Divide & Conquer Strategie

Übung Algorithmen I

Informatik II, SS 2014

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

JAVA - Suchen - Sortieren

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

Übung: Algorithmen und Datenstrukturen SS 2007

Programmieren und Problemlösen

Rekursion. Rekursive Funktionen, Korrektheit, Terminierung, Rekursion vs. Iteration, Sortieren

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

19. Dynamic Programming I

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

Proseminar Effiziente Algorithmen

Algorithmen und Datenstrukturen

Grundlagen: Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen (SS 2013) Prof. Dr. Leif Kobbelt Thomas Ströder, Fabian Emmes, Sven Middelberg, Michael Kremer

4. Sortieren 4.1 Vorbemerkungen

Datenstrukturen. Mariano Zelke. Sommersemester 2012

Algorithmen & Komplexität

Kapitel 3: Sortierverfahren Gliederung

Suchen und Sortieren

Algorithmen und Datenstrukturen 1-3. Seminar -

Christoph Niederseer, Michaela Mayr, Alexander Aichinger, Fabian Küppers. Wissenschaftl. Arbeitstechniken und Präsentation

Suchen und Sortieren

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

Algorithmen und Datenstrukturen

Vorlesung Datenstrukturen

Transkript:

Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2017 Rüdiger Göbl, Mai Bui Computer Aided Medical Procedures Technische Universität München

Fibonacci Zahlen Fibonacci Folge Die Fibonacci Folge ist eine Folge natürlicher Zahlen f 1, f 2, f 3,..., für die gilt f n = f n 1 + f n 2 für n 3 mit Anfangswerten f 1 = 1, f 2 = 1. eingesetzt von Leonardo Fibonacci zur Beschreibung von Wachstum einer Kaninchenpopulation Folge lautet: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,... berechenbar z.b. via Rekursion

Komplexität Fibonacci Rekursiv Input: Index n der Fibonacci Folge Output: Wert f n fib(n): if (n == 1 n == 2) { return 1; } else { return fib(n 1) + fib(n 2); } Für (n == 1 n == 2) gilt: T (1) = T (2) = 1 Für n 3: T (n) = 1 + T (n 1) + T (n 2) Für n 4 Abschätzung: 1 + T (n 1) + T (n 2) 2 T (n 1) T (n) 2 T (n 1)... 2 n 3 T (3) = 2 n 3 3 T = O(2 n )

Komplexität Fibonacci Rekursiv Input: Index n der Fibonacci Folge Output: Wert f n fib(n): if (n == 1 n == 2) { return 1; } else { return fib(n 1) + fib(n 2); } Für (n == 1 n == 2) gilt: T (1) = T (2) = 1 Für n 3: T (n) = 1 + T (n 1) + T (n 2) Für n 3 Abschätzung: 1 + T (n 1) + T (n 2) 2 T (n 2) T (n) 2 T (n 2) 2 k T (n 2k) k = n 2 T (n) 2 n 2

Komplexität Fibonacci Rekursiv Input: Index n der Fibonacci Folge Output: Wert f n fib(n): if (n == 1 n == 2) { return 1; } else { return fib(n 1) + fib(n 2); } 50 3*2 n 3 40 30 20 10 T(n) 2 n/2 0 2 4 6 8 10

Komplexität Fibonacci Dynamisch Input: Index n der Fibonacci Folge Output: Wert f n fibdyn(n): 1 fib = leeres Feld Grösse n; 2 fib[1] = 1; 3 fib[2] = 1; 4 for k = 3 to n { 5 fib[k] = fib[k 1] + fib[k 2]; } Zeile Häufigkeit 1 1 2 1 3 1 4 2n 2 5 n 2 vom kleinsten Teilproblem aufwärts Zwischenergebnisse in Tabelle

Komplexität Fibonacci Dynamisch Input: Index n der Fibonacci Folge Output: Wert f n fibdyn(n): 1 fib = leeres Feld Grösse n; 2 fib[1] = 1; 3 fib[2] = 1; 4 for k = 3 to n { 5 fib[k] = fib[k 1] + fib[k 2]; } Zeile Häufigkeit 1 1 2 1 3 1 4 2n 2 5 n 2 Laufzeit für Zeile 4: Umwandlung der for- in eine while-schleife fibdyn(n):... k = 3; while k n {... k = k + 1; } T = 1 + (n 1) + (n 2) = 2n 2

Komplexität Fibonacci Dynamisch Input: Index n der Fibonacci Folge Output: Wert f n fibdyn(n): 1 fib = leeres Feld Grösse n; 2 fib[1] = 1; 3 fib[2] = 1; 4 for k = 3 to n { 5 fib[k] = fib[k 1] + fib[k 2]; } Zeile Häufigkeit 1 1 2 1 3 1 4 2n 2 5 n 2 T (n) = 1 + 1 + 1 + 1 + (n 2 + 1) + (n 2) + (n 2) = 1 + 1 + 1 + (2n 2) + (n 2) = 3n 1 T = O(n)

Berechnungsdauer der Fibonaccizahlen Rechner mit 2.5 GHz Taktfrequenz Jede Operation benötigt 1 Takt 1 Operation 2.5ns = 0.4ns pro Abschätzung obere Schranke: 3 2 n 3 T (n) 2 n 2 0.4 3 2 97 ns 1.9015 10 20 s mit 1ns = 10 9s 6 10 12 Jahre Abschätzung untere Schranke: 0.4 2 50 ns 4.5035 10 5 s 5Tage Dynamische Programmierung: 3n 1 = 0.4 299 = 199, 6ns

Komplexität der Polynom-Auswertung Input: Koeffizienten-Array a der Länge n+1, Auswertungspunkt x Output: Ergebnis p = a[n] x n +... + a[1]x + a[0] EvaluatePolynomial(a, x): p = 0; for i = n down to 0 { m = 1; for j = 1 to i { m = m x; } m = a[i] m; p = p + m; } Abschätzung Multiplikationen: ( n n(n+1) i=1 i) + (n + 1) = + (n + 1) = 1 2 2 n2 + 3 n + 1 2 Abschätzung der Additionen: n + 1 T (n) = ( 1 2 n2 + 3 2 n + 1) + (n + 1) = O(n2 )

Komplexität der Polynom-Auswertung Input: Koeffizienten-Array a der Länge n+1, Auswertungspunkt x Output: Ergebnis p = a[n] x n +... + a[1]x + a[0] EvaluatePolynomial(a, x): p = 0; h = 1; for i = 0 to n { m = a[i] h; h = h x; p = p + m; } Abschätzung Multiplikationen: 2(n + 1) = 2n + 2 Abschätzung der Additionen: n + 1 T (n) = 2n + 2 + n + 1 = O(n)

Komplexität der Polynom-Auswertung Horner Schema Horner Schema: Ausklammern von x a n x n +... + a 1 x + a 0 = (((...)x + a 2 )x + a 1 )x + a 0 Input: Koeffizienten-Array a der Länge n+1, Auswertungspunkt x Output: Ergebnis p = a[n] x n +... + a[1]x + a[0] EvaluatePolynomial(a, x): p = a[n]; for i = n 1 down to 0 { p = p x; p = p + a[i]; } Abschätzung Multiplikationen n Abschätzung der Additionen: n T (n) = n + n = O(n)

Komplexität der Polynom-Auswertung Vergleich O-Notation O(n 2 ) O(n) O(n) 1 Insgesamt 2 n2 + 5 2n + 2 3n + 3 2n 1 Multiplikation 2 n2 + 3 2 n + 1 2n + 2 n konstante Faktoren beeinflussen die Laufzeit Multiplikation als Vergleich: Horner Schema etwa doppelt so schnell

Divide and Conquer Teile und Herrsche bzw. Divide et Impera Problemlösung durch Aufteilung in Teilprobleme gleicher Art aber kleinerer Größe (Beispiel: Sortiere nur die erste Hälfte) Gesamtlösung durch Zusammenführung der Teillösungen Die Aufteilung erfolgt rekursiv bis zum Trivialfall (Beispiel: Sortiere Liste der Länge 1)

Divide and Conquer: MergeSort Sei A = {a 1,..., a n } Feld mit n natürlichen Zahlen a i N. Aufgabe: sortiere A in aufsteigender Reihenfolge. Lösung mit Divide and Conquer-Muster: Merge Sort Idee: Divide: teile A auf in zwei gleich große Teilfelder Rekursion: rufe Merge Sort rekursiv für die zwei Teilfelder auf Conquer: setze die Teilfelder zusammen (merge bzw. mischen) Wann ist Teilfolge klein, d.h. wann löst man explizit? Teilfolge mit nur einem Element sortiert!

Merge Sort: Hauptfunktion MergeSort(A): if (A ein-elementig) { return A; } else { // Divide: Erzeugung von Teilproblemen (A 1; A 2) = Split(A); // Rekursion: Lösung der Teilprobleme A 1 = MergeSort(A 1); A 2 = MergeSort(A 2); } // Conquer: Kombination der Teillösungen return Merge(A 1, A 2);

Merge Sort: Kombination Merge(A 1, A 2): B = ; while (A 1 und A 2 nicht leer) { if (A 1[0] A 2[0]) { B = push(b, pop(a 1)); } else { B = push(b, pop(a 2)); } } if (A 1 nicht leer) { B = pushall(b, A 1); } else { B = pushall(b, A 2); } return B;

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 0: Anfangszustand

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 1: Divide

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 2: Divide

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 5 4 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 5 4 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 2: Divide

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 9 5 4 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 9 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 9 4 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 9 4 5 8 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 9 4 5 8 3 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 8 3 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 8 3 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 8 3 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 8 3 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 8 3 1 2 Tiefe 1: Divide

Merge Sort Call-Stack 2 4 5 9 8 3 1 2 Tiefe 2: Divide

Merge Sort Call-Stack 2 4 5 9 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 4 5 9 8 3 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 4 5 9 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 3 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 3 8 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 3 8 1 2 Tiefe 2: Divide

Merge Sort Call-Stack 2 4 5 9 3 8 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 4 5 9 3 8 1 2 Tiefe 3: Trivialfall

Merge Sort Call-Stack 2 4 5 9 3 8 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 3 8 1 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 3 8 1 2 Tiefe 2: Conquer/Merge

Merge Sort Call-Stack Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 1 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 1 2 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 1 2 3 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack 2 4 5 9 1 2 3 8 Tiefe 1: Conquer/Merge

Merge Sort Call-Stack Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 3 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 3 4 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 3 4 5 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 3 4 5 8 Tiefe 0: Conquer/Merge

Merge Sort Call-Stack 1 2 2 3 4 5 8 9 Tiefe 0: Conquer/Merge

Divide and Conquer: QuickSort QuickSort: Muster: Divide and Conquer in-place (ohne extra Speicherbedarf) Hauptidee: teile Feld A mittels Pivot-Element A(p) in zwei Teile links vom Pivot-Element A(p) sind alle Elemente kleiner als A(p) rechts vom Pivot-Element A(p) sind alle Elemente größer als A(p) 2 4 3 6 7 9 8 A(p) A(p) A(p)

Quick Sort: Hauptfunktion QuickSort(A, u, o): if (o > u) { // Pivot-Bestimmung nach beliebiger Strategie p = PivotIndex(A); // Divide: Partitionierung relativ zum Pivot pn = Partition(A, u, o, p); // Rekursion: Lösung der Teilprobleme QuickSort(A, u, pn 1); QuickSort(A, pn + 1, o); } // Conquer erfolgt implizit dank In-Place-Sortierung

Quick Sort: Partitionierung Partition(A, u, o, p): pn = u; pv = A[p]; Swap(A, p, o); for i = u to o 1 { if (A[i] pv) { Swap(A, pn, i); pn = pn + 1; } } Swap(A, o, pn); return pn;

Quick Sort: Partitionierung pv = 2 pv > pv p 2 9 5 4 8 3 1 2 u o Anfangszustand

Quick Sort: Partitionierung pv = 2 pv > pv pn p 2 9 5 4 8 3 1 2 u o Pivot ans Ende

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i o 1 Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 9 5 4 8 3 1 2 u i Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 1 5 4 8 3 9 2 u i Schleifendurchlauf

Quick Sort: Partitionierung pv = 2 pv > pv pn 2 1 2 4 8 3 9 5 pv pv > pv Pivot zurück, sortiere grünen und roten Teil rekursiv

Quick Sort Sortierung linker Teil: 2 Pivot-Wahl Element 1 2 1 2 4 8 3 9 5

Quick Sort Sortierung linker Teil: 2 1 2 2 4 8 3 9 5 Partitionierung nach Schleifendurchlauf

Quick Sort Sortierung linker Teil: 2 1 2 2 4 8 3 9 5 Trivial-Schritt: Partitionierung eines ein elementigen Arrays

Quick Sort Sortierung rechter Teil: > 2 Pivot-Wahl Element 5 1 2 2 4 8 3 9 5

Quick Sort Sortierung rechter Teil: > 2 1 2 2 4 3 5 9 8 Partitionierung nach Schleifendurchlauf

Quick Sort Sortierung rechter Teil: > 2 und dessen linker Teil 5 1 2 2 4 3 5 9 8 Pivot-Wahl Element 3

Quick Sort Sortierung rechter Teil: > 2 und dessen linker Teil 5 1 2 2 3 4 5 9 8 Partitionierung nach Schleifendurchlauf

Quick Sort Sortierung rechter Teil: > 2 und dessen linker Teil 5 1 2 2 3 4 5 9 8 Trivial-Schritt: Partitionierung eines ein elementigen Arrays

Quick Sort Sortierung rechter Teil: > 2 und dessen rechter Teil > 5 1 2 2 3 4 5 9 8 Pivot-Wahl Element 8

Quick Sort Sortierung rechter Teil: > 2 und dessen rechter Teil > 5 1 2 2 3 4 5 8 9 Partitionierung nach Schleifendurchlauf

Quick Sort: Sortierung rechter Teil: > 2 und dessen rechter Teil > 5 1 2 2 3 4 5 8 9 Trivial-Schritt: Partitionierung eines ein elementigen Arrays

Quick Sort Implizite Sortierung ohne eigentlichen Merge Schritt Ergebnis 1 2 2 3 4 5 8 9 1 2 2 3 4 5 8 9

Merge-Sort Eingabe: A = {d, b, f, g, e, a, c} MergeSort(A): if (A ein-elementig) { return A; } else { // Divide: Erzeugung von Teilproblemen (A 1; A 2) = Split(A); } // Rekursion: Lösung der Teilprobleme A 1 = MergeSort(A 1); A 2 = MergeSort(A 2); // Conquer: Kombination der Teillösungen return Merge(A 1, A 2); Eingabelänge n ungerade A = a 1,..., a n A left = a 1,..., a n+1, A right = a n+1 +1,..., an 2 2 lexikographische Ordnung für Sortierung von Buchstaben

Merge-Sort d b f g e a c Divide Schritt für n = 7, bei Index n+1 2 = 4

Merge-Sort d b f g e a c Rekursiver Divide Schritt für linkes und rechtes Teilarray

Merge-Sort d b f g e a c Rekursiver Divide Schritt für 4 Teilarrays

Merge-Sort d b f g e a c Conquer/Merge Schritt, nach Aufteilung in minimales Teilproblem

Merge-Sort b d f g a e c Conquer/Merge der jeweiligen Teilarrays mit Sortierung in Arrays der Größe 2

Merge-Sort b d f g a c e Conquer/Merge der jeweiligen Teilarrays der Größe 2 mit Sortierung in Arrays der Größe 4

Merge-Sort Ergebnis a b c d e f g letzter Merge Schritt zu Array der Originalgröße

Quick-Sort Ausgangssituation: 9 8 7 6 5 4 3 2 1 Pivot-Wahl: erstes Element

Quick-Sort Sortierung linker Teil: 9 1 8 7 6 5 4 3 2 9 Partitionierung nach Schleifendurchlauf

Quick-Sort Sortierung linker Teil: 9 1 8 7 6 5 4 3 2 9 Pivot-Wahl erstes Element 1

Quick-Sort Sortierung linker Teil: 9 1 8 7 6 5 4 3 2 9 Partitionierung nach Schleifendurchlauf

Quick-Sort Sortierung linker Teil: 9 und dessen rechter Teil > 1 1 8 7 6 5 4 3 2 9 Pivot-Wahl erstes Element 8

Quick-Sort Sortierung linker Teil: 9 und dessen rechter Teil > 1 1 2 7 6 5 4 3 8 9 Partitionierung nach Schleifendurchlauf Arraygrösse wird bei jeder Partitionierung nur um eins reduziert Worst-Case Laufzeit: O(n 2 )

Quick-Sort Ausgangssituation: 9 8 7 6 5 4 3 2 1 Pivot-Wahl: 5 mittlere Element (bzw. Index n 2 + 1 bei gerader Eingabelänge)

Quick-Sort Sortierung linker Teil und rechter Teil rekursiv 1 4 3 2 5 8 7 6 9 Partitionierung nach Schleifendurchlauf

Quick-Sort Sortierung linker Teil und rechter Teil rekursiv 1 4 3 2 5 8 7 6 9 Pivot-Wahl linker Teil: 3 und rechter Teil: 6

Quick-Sort Sortierung linker Teil und rechter Teil rekursiv 1 2 3 4 5 6 7 9 8 Partitionierung nach Schleifendurchlauf

Quick-Sort Sortierung linker Teil und rechter Teil rekursiv 1 2 3 4 5 6 7 9 8 Pivot-Wahl 2 im Teil 3 und 9 im Teil > 6 Trivialfall im Teil > 3

Quick-Sort Auflösung in minimale Teilprobleme 1 2 3 4 5 6 7 8 9 Ergebnis: 1 2 3 4 5 6 7 8 9 ausgewogenere Partitionierung und bessere Laufzeit O(nlogn)

Komplexität O(nlogn) cn cn cn/2 cn/2 cn log 2 n cn/4 cn/4 cn/4 cn/4 cn... c c c c c... c c cn n mal Baum hat Höhe log 2 n, also log 2 n + 1 Ebenen pro Ebene cn Kosten Gesamtkosten cn(log 2 n + 1) = cn log 2 n + cn T (n) = Θ(n log n)

Sortier-Algorithmen Zusammenfassung Insertion Sort in-place Komplexität O(n 2 ), best case O(n) Selection Sort in-place Komplexität O(n 2 ) Merge Sort benötigt zusätzlichen Speicher Komplexität O(nlogn) Quick Sort in-place Komplexität im Mittel O(nlogn), worst case O(n 2 )