Algorithmen und Datenstrukturen SS09 Foliensatz 13 Michael Brinkmeier Technische Universität Ilmenau Institut für Theoretische Informatik Sommersemester 2009 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 1 / 38 Sortieren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 2 / 38 Das Sortierproblem Das Sortierproblem Daten: eine total geordnete Menge (D, <) von Schlüsseln eine Menge R von Werten Gegeben: Eine Liste (x1 , . . . , xn ) von Paaren xi = (ki , ri ) ∈ D × R Gesucht: Eine Liste (y1 , . . . , yn ) von Paaren in D × R, so dass eine Permutation π : {1, . . . , n} → {1, . . . , n} existiert mit yi = xπ(i ) und kπ(1) ≤ kπ(2) ≤ · · · ≤ kπ(n) . Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 3 / 38 Das Sortierproblem Das Sortierproblem Daten: eine total geordnete Menge (D, <) von Schlüsseln eine Menge R von Werten Gegeben: Eine Liste (x1 , . . . , xn ) von Paaren xi = (ki , ri ) ∈ D × R Gesucht: Eine Liste (y1 , . . . , yn ) von Paaren in D × R, so dass eine Permutation π : {1, . . . , n} → {1, . . . , n} existiert mit yi = xπ(i ) und kπ(1) ≤ kπ(2) ≤ · · · ≤ kπ(n) . Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 3 / 38 Das Sortierproblem Das Sortierproblem Daten: eine total geordnete Menge (D, <) von Schlüsseln eine Menge R von Werten Gegeben: Eine Liste (x1 , . . . , xn ) von Paaren xi = (ki , ri ) ∈ D × R Gesucht: Eine Liste (y1 , . . . , yn ) von Paaren in D × R, so dass eine Permutation π : {1, . . . , n} → {1, . . . , n} existiert mit yi = xπ(i ) und kπ(1) ≤ kπ(2) ≤ · · · ≤ kπ(n) . Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 3 / 38 Ein Beispiel D = N, R = {A, . . . , Z }2 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 4 / 38 4 AN 8 SP 3 VE Ein Beispiel D = N, R = {A, . . . , Z }2 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 1 LI 3 VE 4 AN 4 NG 4 LO 6 DP 8 SP 8 RO 9 ER Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 4 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Bereits bekannte Sortiermethoden Straight Insertion Sort BubbleSort (Übung) MergeSort (AuP) SelectionSort oder MaxSort (AuP) Quicksort (AuP) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 5 / 38 Stabilität Definition (Stabiles Sortierverfahren) Ein Sortierverfahren heisst stabil, wenn Objekte mit identischen Schlüsseln in der Ausgabe in derselben Reihenfolge stehen wie in der Eingabe. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 6 / 38 Stabilität Definition (Stabiles Sortierverfahren) Ein Sortierverfahren heisst stabil, wenn Objekte mit identischen Schlüsseln in der Ausgabe in derselben Reihenfolge stehen wie in der Eingabe. 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 1 LI 3 VE 4 AN 4 NG 4 LO 6 DP 8 SP 8 RO 9 ER Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 6 / 38 Stabilität Definition (Stabiles Sortierverfahren) Ein Sortierverfahren heisst stabil, wenn Objekte mit identischen Schlüsseln in der Ausgabe in derselben Reihenfolge stehen wie in der Eingabe. 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 8 RO 9 ER Nicht stabil! 1 LI 3 VE 4 AN 4 NG 4 LO 6 DP Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 6 / 38 8 SP Stabilität 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 38 4 AN 8 SP 3 VE Stabilität 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 1 LI 3 VE 4 LO 4 NG 4 AN 6 DP 8 RO 8 SP 9 ER Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 38 Stabilität 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 8 SP 9 ER Stabil! 1 LI 3 VE 4 LO 4 NG 4 AN 6 DP Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 38 8 RO Stabilität 4 LO 6 DP 9 ER 1 LI 4 NG 8 RO 4 AN 8 SP 3 VE 8 SP 9 ER Stabil! 1 LI 3 VE 4 LO 4 NG 4 AN 6 DP Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 7 / 38 8 RO Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Kriterien für die Effizienz von Sortieralgorithmen Laufzeit (O-Notation) Anzahl der Vergleiche A[i] < A[j] bzw. A[i] ≤ A[j] Die Anzahl der Datenverschiebungen oder Kopiervorgänge insbesondere bei großen Datensätzen. Kann häufig durch Zeiger auf die Speicherbereiche der Daten gemildert werden. der zusätzlich zu A[] benötigte Speicher. Wenn nur O(1) zusätzlicher Speicher benötigt wird, spricht man von in situ oder in place Verfahren Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 8 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Bekannte Verfahren StraightInsertionSort Θ(n2 ) Vergleiche und Zeit im schlechtesten bzw. mittleren Fall. Θ(n) im besten Fall. stabil und in situ Mergesort Θ(n log n) Vergleiche und Zeit Stabil aber nicht in situ, da zwei Arrays benutzt werden. Mergesort mit Listen benötigt keinen Zusatzplatz, erfordert aber das zusätzliche Speichern von Zeigern. Mergesort ist die Basis für externes Sortieren, d.h. Algorithmen, die nicht direkt auf dem Hauptspeicher, sondern z.B. auf Festplatten arbeiten. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 9 / 38 Quicksort Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 10 / 38 Divide-and-Conquer Die Grundidee von Divide-And-Conquer Teile und Herrsche/Erobere 1 Zerlege das Problem 2 Löse die Teilprobleme rekursiv Kombiniere die Lösungen der Teilprobleme zu einer Lösung des Ursprungsproblems. 3 Dieses Prinzip verwendet Quicksort. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 38 Divide-and-Conquer Die Grundidee von Divide-And-Conquer Teile und Herrsche/Erobere 1 Zerlege das Problem 2 Löse die Teilprobleme rekursiv Kombiniere die Lösungen der Teilprobleme zu einer Lösung des Ursprungsproblems. 3 Dieses Prinzip verwendet Quicksort. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 38 Divide-and-Conquer Die Grundidee von Divide-And-Conquer Teile und Herrsche/Erobere 1 Zerlege das Problem 2 Löse die Teilprobleme rekursiv Kombiniere die Lösungen der Teilprobleme zu einer Lösung des Ursprungsproblems. 3 Dieses Prinzip verwendet Quicksort. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 38 Divide-and-Conquer Die Grundidee von Divide-And-Conquer Teile und Herrsche/Erobere 1 Zerlege das Problem 2 Löse die Teilprobleme rekursiv Kombiniere die Lösungen der Teilprobleme zu einer Lösung des Ursprungsproblems. 3 Dieses Prinzip verwendet Quicksort. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 38 Divide-and-Conquer Die Grundidee von Divide-And-Conquer Teile und Herrsche/Erobere 1 Zerlege das Problem 2 Löse die Teilprobleme rekursiv Kombiniere die Lösungen der Teilprobleme zu einer Lösung des Ursprungsproblems. 3 Dieses Prinzip verwendet Quicksort. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 11 / 38 Eine Verallgemeinerung des Sortierproblemes Sortieren eines Teilintervalls Gegeben: Ein Array A[1 . . . n] und zwei Indices a, b mit 1 ≤ a ≤ b ≤ n. Ziel: Sortiere den Inhalt des Teilarrays A[a . . . b] aufsteigend, ohne die Inhalte der übrigen Einträge zu verändern. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 12 / 38 Quicksort Quicksort teilt die Eingabeliste in zwei Listen, die unabhängig voneinander sortiert werden. Entscheidend ist dabei die Wahl der Teillisten. Quicksort - Konzept Eingabe: A[1 . . . n] und zwei Indices a, b mit 1 ≤ a ≤ b ≤ n Ordne A[a . . . b] um, so dass ein p mit a ≤ p ≤ b existiert mit A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b]. wenn (a < p − 1) dann Quicksort(a, p − 1) wenn (p + 1 < b) dann Quicksort(p + 1, b) Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 13 / 38 Quicksort Quicksort sortiert das Array A[a . . . b] vor, in dem es dafür sorgt, dass es einen bekannten Index p mit a ≤ p ≤ b gibt mit A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b]. Ist dies erreicht, so genügt es die beiden Teilarrays A[a . . . p − 1] und A[p + 1 . . . b] zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 14 / 38 Quicksort Quicksort sortiert das Array A[a . . . b] vor, in dem es dafür sorgt, dass es einen bekannten Index p mit a ≤ p ≤ b gibt mit A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b]. Ist dies erreicht, so genügt es die beiden Teilarrays A[a . . . p − 1] und A[p + 1 . . . b] zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 14 / 38 Das Pivot-Element Frage Wie kann man die Vorsortierung realisieren? Die Antwort darauf ist das Pivot-Element. Es wird ein Element A[p̂] mit a ≤ p̂ ≤ b gewählt und die Elemente von A[a . . . b] entsprechend umgeordnet. Die neue Position des ursprünglichen Elementes A[p̂] ist dann die im Algorithmus verwendete Position p. Die Wahl des Pivot-Elementes beeinflusst die Laufzeit von Quicksort wesentlich. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 38 Das Pivot-Element Frage Wie kann man die Vorsortierung realisieren? Die Antwort darauf ist das Pivot-Element. Es wird ein Element A[p̂] mit a ≤ p̂ ≤ b gewählt und die Elemente von A[a . . . b] entsprechend umgeordnet. Die neue Position des ursprünglichen Elementes A[p̂] ist dann die im Algorithmus verwendete Position p. Die Wahl des Pivot-Elementes beeinflusst die Laufzeit von Quicksort wesentlich. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 38 Das Pivot-Element Frage Wie kann man die Vorsortierung realisieren? Die Antwort darauf ist das Pivot-Element. Es wird ein Element A[p̂] mit a ≤ p̂ ≤ b gewählt und die Elemente von A[a . . . b] entsprechend umgeordnet. Die neue Position des ursprünglichen Elementes A[p̂] ist dann die im Algorithmus verwendete Position p. Die Wahl des Pivot-Elementes beeinflusst die Laufzeit von Quicksort wesentlich. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 38 Das Pivot-Element Frage Wie kann man die Vorsortierung realisieren? Die Antwort darauf ist das Pivot-Element. Es wird ein Element A[p̂] mit a ≤ p̂ ≤ b gewählt und die Elemente von A[a . . . b] entsprechend umgeordnet. Die neue Position des ursprünglichen Elementes A[p̂] ist dann die im Algorithmus verwendete Position p. Die Wahl des Pivot-Elementes beeinflusst die Laufzeit von Quicksort wesentlich. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 38 Das Pivot-Element Frage Wie kann man die Vorsortierung realisieren? Die Antwort darauf ist das Pivot-Element. Es wird ein Element A[p̂] mit a ≤ p̂ ≤ b gewählt und die Elemente von A[a . . . b] entsprechend umgeordnet. Die neue Position des ursprünglichen Elementes A[p̂] ist dann die im Algorithmus verwendete Position p. Die Wahl des Pivot-Elementes beeinflusst die Laufzeit von Quicksort wesentlich. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 15 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Strategien zur Wahl des Pivot-Elementes Wähle p̂ = a, d.h. wir wählen das erste Element des zu sortierenden Teilarrays. Wähle p̂ = b, d.h. wir wählen das letzte Element des zu sortierenden Teilarrays. Wähle p̂ = ⌊ a+b 2 ⌋, d.h. wir wählen das mittlere Element des zu sortierenden Teilarrays. Clever Quicksort: Wähle p̂ als den Index des Medians von drei Positionen (z.B. a, b und ⌊(a + b)/2⌋). Randomisiertes Quicksort: Wähle p̂ zufällig aus {a, . . . , b}. Unabhängig von der Wahl von p̂ können wir direkt A[a] und A[p̂] vertauschen und im Folgenden von p̂ = a ausgehen. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 16 / 38 Die Partitionierung Frage Sei x = A[a] vor dem Umordnen. Wie können wir nun A[a . . . b] so umsortieren und ein p bestimmen, so dass anschließend A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b] gilt? Zur Lösung diese Problemes gibt es verschiedene Lösungen. Wir stellen im Folgende eine von N. Lomuto vorgeschlagene Prozedur vor, die sich von der Originalprozedur von Hoare (in AuP vorgestellt) unterscheidet. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 17 / 38 Die Partitionierung Frage Sei x = A[a] vor dem Umordnen. Wie können wir nun A[a . . . b] so umsortieren und ein p bestimmen, so dass anschließend A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b] gilt? Zur Lösung diese Problemes gibt es verschiedene Lösungen. Wir stellen im Folgende eine von N. Lomuto vorgeschlagene Prozedur vor, die sich von der Originalprozedur von Hoare (in AuP vorgestellt) unterscheidet. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 17 / 38 Die Partitionierung Frage Sei x = A[a] vor dem Umordnen. Wie können wir nun A[a . . . b] so umsortieren und ein p bestimmen, so dass anschließend A[a], . . . , A[p − 1] ≤ A[p]<A[p + 1], . . . , A[b] gilt? Zur Lösung diese Problemes gibt es verschiedene Lösungen. Wir stellen im Folgende eine von N. Lomuto vorgeschlagene Prozedur vor, die sich von der Originalprozedur von Hoare (in AuP vorgestellt) unterscheidet. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 17 / 38 Partition - Die Teilung des Feldes Wir teilen das Feld A[a . . . b] mit Hilfe des Pivot-Elementes A[a]. Anschließend werden wir stets zwei Indices i und j mitführen, so dass 1 2 3 A[a + 1 . . . i − 1] nur Schlüssel ≤ A[a], A[i . . . j − 1] nur Schlüssel > A[a] und A[j . . . r ] beliebige Schlüssel enthält. Da wir zu Beginn nichts wissen, erfüllt die Wahl i = a + 1 und j = a + 1, diese Bedingungen. D.h. die ersten beiden Teile sind leer und der letzte Teil umfasst ganz A[a + 1 . . . b]. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 18 / 38 Partition - Die Teilung des Feldes Wir teilen das Feld A[a . . . b] mit Hilfe des Pivot-Elementes A[a]. Anschließend werden wir stets zwei Indices i und j mitführen, so dass 1 2 3 A[a + 1 . . . i − 1] nur Schlüssel ≤ A[a], A[i . . . j − 1] nur Schlüssel > A[a] und A[j . . . r ] beliebige Schlüssel enthält. Da wir zu Beginn nichts wissen, erfüllt die Wahl i = a + 1 und j = a + 1, diese Bedingungen. D.h. die ersten beiden Teile sind leer und der letzte Teil umfasst ganz A[a + 1 . . . b]. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 18 / 38 Partition - Die Teilung des Feldes Wir teilen das Feld A[a . . . b] mit Hilfe des Pivot-Elementes A[a]. Anschließend werden wir stets zwei Indices i und j mitführen, so dass 1 2 3 A[a + 1 . . . i − 1] nur Schlüssel ≤ A[a], A[i . . . j − 1] nur Schlüssel > A[a] und A[j . . . r ] beliebige Schlüssel enthält. Da wir zu Beginn nichts wissen, erfüllt die Wahl i = a + 1 und j = a + 1, diese Bedingungen. D.h. die ersten beiden Teile sind leer und der letzte Teil umfasst ganz A[a + 1 . . . b]. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 18 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: a j −1 j a+1 i −1 i b P ··· ≤P Y ··· X ··· >P Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: a j −1 j a+1 i −1 i b P ··· ≤P Y ··· X ··· >P Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: a j −1 j a+1 i −1 i b P ··· ≤P Y ··· X ··· >P Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: a j −1 j a+1 i −1 i b P ··· ≤P Y ··· X ··· >P Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Wir werden nun sukzessive j erhöhen und i dabei geeignet mitführen, so dass am Ende j = b + 1 gilt und i die Position des ersten Elementes > A[a] angibt. Im Allgemeinen sieht, wenn wir x = A[j] bearbeiten wollen, die Situation so aus: a j −1 j a+1 i −1 i b P ··· ≤P X ··· Y ··· >P Falls X > P gilt, können wir j einfach erhöhen. Falls X ≤ P gilt, muss es an die Position i gebracht werden. Dies wird durch den Tausch von A[i] und A[j] und das Erhöhen von i und j erreicht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 19 / 38 Partition - Die Teilung des Feldes Partition(a, b) Eingabe: Ein Feld A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. Ausgabe: Die Position des Pivotelementes A[a] in der geteilten Folge. x = A[a] i =a+1 für j = a + 1 . . . b tue wenn A[j] ≤ x dann Tausche A[i] und A[j] i =i +1 Ende Ende Tausche A[a] und A[i − 1] zurück i − 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 38 Partition - Die Teilung des Feldes Partition(a, b) Eingabe: Ein Feld A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. Ausgabe: Die Position des Pivotelementes A[a] in der geteilten Folge. x = A[a] i =a+1 für j = a + 1 . . . b tue wenn A[j] ≤ x dann Tausche A[i] und A[j] i =i +1 Ende Ende Tausche A[a] und A[i − 1] zurück i − 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 38 Partition - Die Teilung des Feldes Partition(a, b) Eingabe: Ein Feld A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. Ausgabe: Die Position des Pivotelementes A[a] in der geteilten Folge. x = A[a] i =a+1 für j = a + 1 . . . b tue wenn A[j] ≤ x dann Tausche A[i] und A[j] i =i +1 Ende Ende Tausche A[a] und A[i − 1] zurück i − 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 38 Partition - Die Teilung des Feldes Partition(a, b) Eingabe: Ein Feld A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. Ausgabe: Die Position des Pivotelementes A[a] in der geteilten Folge. x = A[a] i =a+1 für j = a + 1 . . . b tue wenn A[j] ≤ x dann Tausche A[i] und A[j] i =i +1 Ende Ende Tausche A[a] und A[i − 1] zurück i − 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 38 Partition - Die Teilung des Feldes Partition(a, b) Eingabe: Ein Feld A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. Ausgabe: Die Position des Pivotelementes A[a] in der geteilten Folge. x = A[a] i =a+1 für j = a + 1 . . . b tue wenn A[j] ≤ x dann Tausche A[i] und A[j] i =i +1 Ende Ende Tausche A[a] und A[i − 1] zurück i − 1 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 23 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Partition - Ein Beispiel Partition(A[1 . . . 8], 1, 8) 4 4 4 4 4 4 4 4 4 4 9 9 9 1 1 1 1 1 1 1 6 6 6 6 6 6 6 3 3 3 1 1 1 9 9 9 9 9 9 2 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 3 3 3 3 3 3 3 6 6 6 2 2 2 2 2 2 2 2 2 9 i = 2, j = 2 i = 2, j = 3 i = 2, j = 4 Tausche A[2] und A[4] i = 3, j = 5 i = 3, j = 6 i = 3, j = 7 Tausche A[3] und A[7] i = 4, j = 8 Tausche A[4] und A[8] 2 1 3 4 7 8 6 9 Tausche A[4] und A[1] Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 24 / 38 Der Aufwand von Partition Betrachtet man den Pseudocode sieht man, dass innerhalb der Schleife für jedes Element – außer dem Pivot-Element A[a] genau ein Vergleich und höchstens ein Tausch stattfindet. Lemma Partiton benötigt auf dem Array A[a . . . b] höchstens O(b − a + 1) Vergleiche und Zeit. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 25 / 38 Der Aufwand von Partition Betrachtet man den Pseudocode sieht man, dass innerhalb der Schleife für jedes Element – außer dem Pivot-Element A[a] genau ein Vergleich und höchstens ein Tausch stattfindet. Lemma Partiton benötigt auf dem Array A[a . . . b] höchstens O(b − a + 1) Vergleiche und Zeit. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 25 / 38 Quicksort Quicksort(A[1 . . . n], a, b) Eingabe: A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. wenn a < b dann Wähle p̂ mit a ≤ p̂ ≤ b; Tausche A[a] und A[p̂] aus; k = Partition(A, a, b); wenn a < k − 1 dann Quicksort(a, k − 1); wenn k + 1 < b dann Quicksort(k + 1, b); Ende Behandlung kurzer Felder Um die Rekursion zu verkürzen kann man Felder unter einer gewissen konstanten Länge mittels eines anderen, nicht rekursiven Verfahrens, wie z.B. Straight Insertion Sort oder Bubblesort, sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 26 / 38 Quicksort Quicksort(A[1 . . . n], a, b) Eingabe: A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. wenn a < b dann Wähle p̂ mit a ≤ p̂ ≤ b; Tausche A[a] und A[p̂] aus; k = Partition(A, a, b); wenn a < k − 1 dann Quicksort(a, k − 1); wenn k + 1 < b dann Quicksort(k + 1, b); Ende Behandlung kurzer Felder Um die Rekursion zu verkürzen kann man Felder unter einer gewissen konstanten Länge mittels eines anderen, nicht rekursiven Verfahrens, wie z.B. Straight Insertion Sort oder Bubblesort, sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 26 / 38 Quicksort Quicksort(A[1 . . . n], a, b) Eingabe: A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. wenn a < b dann Wähle p̂ mit a ≤ p̂ ≤ b; Tausche A[a] und A[p̂] aus; k = Partition(A, a, b); wenn a < k − 1 dann Quicksort(a, k − 1); wenn k + 1 < b dann Quicksort(k + 1, b); Ende Behandlung kurzer Felder Um die Rekursion zu verkürzen kann man Felder unter einer gewissen konstanten Länge mittels eines anderen, nicht rekursiven Verfahrens, wie z.B. Straight Insertion Sort oder Bubblesort, sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 26 / 38 Quicksort Quicksort(A[1 . . . n], a, b) Eingabe: A[1 . . . n] und zwei Indices 1 ≤ a ≤ b ≤ n. wenn a < b dann Wähle p̂ mit a ≤ p̂ ≤ b; Tausche A[a] und A[p̂] aus; k = Partition(A, a, b); wenn a < k − 1 dann Quicksort(a, k − 1); wenn k + 1 < b dann Quicksort(k + 1, b); Ende Behandlung kurzer Felder Um die Rekursion zu verkürzen kann man Felder unter einer gewissen konstanten Länge mittels eines anderen, nicht rekursiven Verfahrens, wie z.B. Straight Insertion Sort oder Bubblesort, sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 26 / 38 Quicksort Lemma Quicksort(A[], a, b) sortiert das Teilarray A[a . . . b]. Das Lemma lässt sich induktiv über die Länge des Teilarrays beweisen. Das Hauptargument für den Induktionsschritt haben wir bereits am Anfang gesehen: Nach Partition genügt es die beiden Teilfelder vor und hinter dem Pivot-Element zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 38 Quicksort Lemma Quicksort(A[], a, b) sortiert das Teilarray A[a . . . b]. Das Lemma lässt sich induktiv über die Länge des Teilarrays beweisen. Das Hauptargument für den Induktionsschritt haben wir bereits am Anfang gesehen: Nach Partition genügt es die beiden Teilfelder vor und hinter dem Pivot-Element zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 38 Quicksort Lemma Quicksort(A[], a, b) sortiert das Teilarray A[a . . . b]. Das Lemma lässt sich induktiv über die Länge des Teilarrays beweisen. Das Hauptargument für den Induktionsschritt haben wir bereits am Anfang gesehen: Nach Partition genügt es die beiden Teilfelder vor und hinter dem Pivot-Element zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 38 Quicksort Lemma Quicksort(A[], a, b) sortiert das Teilarray A[a . . . b]. Das Lemma lässt sich induktiv über die Länge des Teilarrays beweisen. Das Hauptargument für den Induktionsschritt haben wir bereits am Anfang gesehen: Nach Partition genügt es die beiden Teilfelder vor und hinter dem Pivot-Element zu sortieren. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 27 / 38 Quicksort - Der Worst-Case QS(n) sei die Anzahl der Schlüsselvergleiche bei Eingabe eines Feldes mit n Einträgen. Es gilt QS(0) = QS(1) = 0 und QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} . 1≤k≤n Der zweite Summand ergibt sich aus der Tatsache, dass das Feld in zwei kleinere Felder der Länge k − 1 und n − k (das Pivot-Element wird herausgenommen) gespalten wird und darauf Quicksort ausgeführt wird. Partition vergleicht für die Spaltung die restlichen n − 1 Elemente mit dem Pivotelement, was somit n − 1 Vergleichen entspricht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 38 Quicksort - Der Worst-Case QS(n) sei die Anzahl der Schlüsselvergleiche bei Eingabe eines Feldes mit n Einträgen. Es gilt QS(0) = QS(1) = 0 und QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} . 1≤k≤n Der zweite Summand ergibt sich aus der Tatsache, dass das Feld in zwei kleinere Felder der Länge k − 1 und n − k (das Pivot-Element wird herausgenommen) gespalten wird und darauf Quicksort ausgeführt wird. Partition vergleicht für die Spaltung die restlichen n − 1 Elemente mit dem Pivotelement, was somit n − 1 Vergleichen entspricht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 38 Quicksort - Der Worst-Case QS(n) sei die Anzahl der Schlüsselvergleiche bei Eingabe eines Feldes mit n Einträgen. Es gilt QS(0) = QS(1) = 0 und QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} . 1≤k≤n Der zweite Summand ergibt sich aus der Tatsache, dass das Feld in zwei kleinere Felder der Länge k − 1 und n − k (das Pivot-Element wird herausgenommen) gespalten wird und darauf Quicksort ausgeführt wird. Partition vergleicht für die Spaltung die restlichen n − 1 Elemente mit dem Pivotelement, was somit n − 1 Vergleichen entspricht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 38 Quicksort - Der Worst-Case QS(n) sei die Anzahl der Schlüsselvergleiche bei Eingabe eines Feldes mit n Einträgen. Es gilt QS(0) = QS(1) = 0 und QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} . 1≤k≤n Der zweite Summand ergibt sich aus der Tatsache, dass das Feld in zwei kleinere Felder der Länge k − 1 und n − k (das Pivot-Element wird herausgenommen) gespalten wird und darauf Quicksort ausgeführt wird. Partition vergleicht für die Spaltung die restlichen n − 1 Elemente mit dem Pivotelement, was somit n − 1 Vergleichen entspricht. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 28 / 38 Quicksort - Worst-Case Satz QS(n) ≤ n+1 X i +1= i =1 (n + 2)(n + 1) + 1 = O(n2 ) für n ≥ 1 2 Beweis (QS Worst-Case) Für n = 1 gilt die Behauptung offensichtlich. Für n > 1 ergibt sich QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} 1≤k≤n IV k(k + 1) (n − k + 1)(n − k + 2) ≤ n − 1 + max + +2 1≤k≤n 2 2 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 29 / 38 ... Quicksort - Worst-Case Satz QS(n) ≤ n+1 X i +1= i =1 (n + 2)(n + 1) + 1 = O(n2 ) für n ≥ 1 2 Beweis (QS Worst-Case) Für n = 1 gilt die Behauptung offensichtlich. Für n > 1 ergibt sich QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} 1≤k≤n IV k(k + 1) (n − k + 1)(n − k + 2) + +2 ≤ n − 1 + max 1≤k≤n 2 2 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 29 / 38 ... Quicksort - Worst-Case Satz QS(n) ≤ n+1 X i +1= i =1 (n + 2)(n + 1) + 1 = O(n2 ) für n ≥ 1 2 Beweis (QS Worst-Case) Für n = 1 gilt die Behauptung offensichtlich. Für n > 1 ergibt sich QS(n) ≤ n − 1 + max {QS(k − 1) + QS(n − k)} 1≤k≤n IV k(k + 1) (n − k + 1)(n − k + 2) ≤ n − 1 + max + +2 1≤k≤n 2 2 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 29 / 38 ... Quicksort - Worst-Case Beweis (QS Worst-Case - Fortsetzung) Betrachtet man die Funktion f (x) = x(x + 1) (n − x + 1)(n − x + 2) + +2 2 2 sieht man, dass sie ihr Maximum auf dem Intervall [1, n] an den Rändern annimmt. Offensichtlich gilt f (1) = f (n). Damit erhalten wir n(n + 1) n(n + 1) +2=n+ +2 2 2 2n + n2 + n + 4 n2 + 3n + 2 + 2 = = 2 2 (n + 1)(n + 2) = + 1. 2 QS(n) ≤ n − 1 + 1 + Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 38 Quicksort - Worst-Case Beweis (QS Worst-Case - Fortsetzung) Betrachtet man die Funktion f (x) = x(x + 1) (n − x + 1)(n − x + 2) + +2 2 2 sieht man, dass sie ihr Maximum auf dem Intervall [1, n] an den Rändern annimmt. Offensichtlich gilt f (1) = f (n). Damit erhalten wir n(n + 1) n(n + 1) +2=n+ +2 2 2 2n + n2 + n + 4 n2 + 3n + 2 + 2 = = 2 2 (n + 1)(n + 2) = + 1. 2 QS(n) ≤ n − 1 + 1 + Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 38 Quicksort - Worst-Case Beweis (QS Worst-Case - Fortsetzung) Betrachtet man die Funktion f (x) = x(x + 1) (n − x + 1)(n − x + 2) + +2 2 2 sieht man, dass sie ihr Maximum auf dem Intervall [1, n] an den Rändern annimmt. Offensichtlich gilt f (1) = f (n). Damit erhalten wir n(n + 1) n(n + 1) +2=n+ +2 2 2 n2 + 3n + 2 + 2 2n + n2 + n + 4 = = 2 2 (n + 1)(n + 2) = + 1. 2 QS(n) ≤ n − 1 + 1 + Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 38 Quicksort - Worst-Case Beweis (QS Worst-Case - Fortsetzung) Betrachtet man die Funktion f (x) = x(x + 1) (n − x + 1)(n − x + 2) + +2 2 2 sieht man, dass sie ihr Maximum auf dem Intervall [1, n] an den Rändern annimmt. Offensichtlich gilt f (1) = f (n). Damit erhalten wir n(n + 1) n(n + 1) +2=n+ +2 2 2 2n + n2 + n + 4 n2 + 3n + 2 + 2 = = 2 2 (n + 1)(n + 2) + 1. = 2 QS(n) ≤ n − 1 + 1 + Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 38 Quicksort - Worst-Case Beweis (QS Worst-Case - Fortsetzung) Betrachtet man die Funktion f (x) = x(x + 1) (n − x + 1)(n − x + 2) + +2 2 2 sieht man, dass sie ihr Maximum auf dem Intervall [1, n] an den Rändern annimmt. Offensichtlich gilt f (1) = f (n). Damit erhalten wir n(n + 1) n(n + 1) +2=n+ +2 2 2 2n + n2 + n + 4 n2 + 3n + 2 + 2 = = 2 2 (n + 1)(n + 2) = + 1. 2 QS(n) ≤ n − 1 + 1 + Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 30 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 Quicksort - Der Average-Case Die oben hergeleitete Schranke, für die Anzahl der Vergleiche im schlechtesten Fall, wird tatsächlich angenommen, wenn als Pivotelement z.B. stets das kleinste Element gewählt wird. Da dieser Fall nur sehr selten eintritt, stellt sich die Frage nach dem Verhalten von Quicksort im mittleren Fall. Für unsere Analyse setzen wir die folgenden Bedingungen voraus: Die Schlüssel sind paarweise verschieden. Jede Anordnung der Eingabeelemente hat dieselbe Wahrscheinlichkeit. Wählt man das Pivotelement über einen festen Index, so ist es mit Wahrscheinlichkeit n1 das k-te Element der sortierten Folge. Damit müssen nach dem Aufteilen zwei Probleme der Größe k und n − k gelöst werden. Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 31 / 38 QS - Average-Case Sei QS(n) die mittlere Anzahl der von Quicksort benötigten Vergleiche. Dann gilt QS(0) = QS(1) = 1 und für n ≥ 2 QS(n) = n X 1 n − 1 + QS(k − 1) + QS(n − k) n k=1 =n−1+ n n X X 1 1 QS(k − 1) + QS(n − k) n n k=1 k=1 n−1 n−1 X X 1 1 QS(k) + QS(k) =n−1+ n n k=0 k=0 n−1 2X =n−1+ QS(k). n k=0 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 32 / 38 QS - Average-Case Sei QS(n) die mittlere Anzahl der von Quicksort benötigten Vergleiche. Dann gilt QS(0) = QS(1) = 1 und für n ≥ 2 QS(n) = n X 1 n − 1 + QS(k − 1) + QS(n − k) n k=1 =n−1+ n n X X 1 1 QS(k − 1) + QS(n − k) n n k=1 k=1 n−1 n−1 X X 1 1 =n−1+ QS(k) + QS(k) n n k=0 k=0 n−1 2X =n−1+ QS(k). n k=0 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 32 / 38 QS - Average-Case Sei QS(n) die mittlere Anzahl der von Quicksort benötigten Vergleiche. Dann gilt QS(0) = QS(1) = 1 und für n ≥ 2 QS(n) = n X 1 n − 1 + QS(k − 1) + QS(n − k) n k=1 =n−1+ n n X X 1 1 QS(k − 1) + QS(n − k) n n k=1 k=1 n−1 n−1 X X 1 1 QS(k) + QS(k) =n−1+ n n k=0 k=0 n−1 2X =n−1+ QS(k). n k=0 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 32 / 38 QS - Average-Case Sei QS(n) die mittlere Anzahl der von Quicksort benötigten Vergleiche. Dann gilt QS(0) = QS(1) = 1 und für n ≥ 2 QS(n) = n X 1 n − 1 + QS(k − 1) + QS(n − k) n k=1 =n−1+ n n X X 1 1 QS(k − 1) + QS(n − k) n n k=1 k=1 n−1 n−1 X X 1 1 QS(k) + QS(k) =n−1+ n n k=0 k=0 n−1 2X =n−1+ QS(k). n k=0 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 32 / 38 QS - Average-Case Damit ergibt sich nQS(n)−(n − 1)QS(n − 1) = n(n − 1) + 2 n−1 X QS(k) − (n − 1)(n − 2) − 2 k=0 n−1 X k=0 = 2(n − 1) + 2QS(n − 1) QS(n) = 2 QS(k) − n−2 X k=0 n−1 n+1 QS(n − 1). + n n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau QS(k) k=0 = (n − 1)(n − n + 2) + 2 und somit n−2 X Seite 33 / 38 ! QS(k) QS - Average-Case Damit ergibt sich nQS(n)−(n − 1)QS(n − 1) = n(n − 1) + 2 n−1 X QS(k) − (n − 1)(n − 2) − 2 k=0 n−1 X k=0 = 2(n − 1) + 2QS(n − 1) QS(n) = 2 QS(k) − n−2 X k=0 n−1 n+1 QS(n − 1). + n n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau QS(k) k=0 = (n − 1)(n − n + 2) + 2 und somit n−2 X Seite 33 / 38 ! QS(k) QS - Average-Case Damit ergibt sich nQS(n)−(n − 1)QS(n − 1) = n(n − 1) + 2 n−1 X QS(k) − (n − 1)(n − 2) − 2 k=0 n−1 X k=0 = 2(n − 1) + 2QS(n − 1) QS(n) = 2 QS(k) − n−2 X k=0 n−1 n+1 QS(n − 1). + n n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau QS(k) k=0 = (n − 1)(n − n + 2) + 2 und somit n−2 X Seite 33 / 38 ! QS(k) QS - Average-Case Damit ergibt sich nQS(n)−(n − 1)QS(n − 1) = n(n − 1) + 2 n−1 X QS(k) − (n − 1)(n − 2) − 2 k=0 n−1 X k=0 = 2(n − 1) + 2QS(n − 1) QS(n) = 2 QS(k) − n−2 X k=0 n−1 n+1 QS(n − 1). + n n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau QS(k) k=0 = (n − 1)(n − n + 2) + 2 und somit n−2 X Seite 33 / 38 ! QS(k) QS - Average-Case Damit ergibt sich nQS(n)−(n − 1)QS(n − 1) = n(n − 1) + 2 n−1 X QS(k) − (n − 1)(n − 2) − 2 k=0 n−1 X k=0 = 2(n − 1) + 2QS(n − 1) QS(n) = 2 QS(k) − n−2 X k=0 n−1 n+1 QS(n − 1). + n n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau QS(k) k=0 = (n − 1)(n − n + 2) + 2 und somit n−2 X Seite 33 / 38 ! QS(k) Lemma QS(n) = 2(n + 1) n+1 X 1 i =4 i + 5−n für n ≥ 2. 3 Beweis Für n = 2 ergibt sich die rechte Seite als 0 + Für n ≥ 3 gilt 3 3 = 1 = QS(2). n−1 n+1 + QS(n − 1) n n ! n X 1 5 − (n − 1) 2 n+1 2n + =2− + n n i 3 i =4 ! n X 1 6−n n+1 2 n+1 2n − + + =2 n+1 n n i 3 QS(n) = 2 i =4 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 34 / 38 Lemma QS(n) = 2(n + 1) n+1 X 1 i =4 i + 5−n für n ≥ 2. 3 Beweis Für n = 2 ergibt sich die rechte Seite als 0 + Für n ≥ 3 gilt 3 3 = 1 = QS(2). n−1 n+1 + QS(n − 1) n n ! n X 1 5 − (n − 1) 2 n+1 2n + =2− + n n i 3 i =4 ! n X 1 6−n n+1 2 n+1 2n − + + =2 n+1 n n i 3 QS(n) = 2 i =4 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 34 / 38 Lemma QS(n) = 2(n + 1) n+1 X 1 i =4 i + 5−n für n ≥ 2. 3 Beweis Für n = 2 ergibt sich die rechte Seite als 0 + Für n ≥ 3 gilt 3 3 = 1 = QS(2). n−1 n+1 + QS(n − 1) n n ! n X 1 5 − (n − 1) 2 n+1 2n + =2− + n n i 3 i =4 ! n X 1 6−n n+1 2 n+1 2n − + + =2 n+1 n n i 3 QS(n) = 2 i =4 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 34 / 38 Lemma QS(n) = 2(n + 1) n+1 X 1 i =4 i + 5−n für n ≥ 2. 3 Beweis Für n = 2 ergibt sich die rechte Seite als 0 + Für n ≥ 3 gilt 3 3 = 1 = QS(2). n−1 n+1 + QS(n − 1) n n ! n X 1 5 − (n − 1) 2 n+1 2n + =2− + n n i 3 i =4 ! n X 1 6−n n+1 2 n+1 2n − + + =2 n+1 n n i 3 QS(n) = 2 i =4 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 34 / 38 Beweis (Fortsetzung) n+1 2 n+1 QS(n) = 2 − + n+1 n n = 2(n + 1) = 2(n + 1) 1 + n+1 n+1 X 1 i =4 = 2(n + 1) n+1 X i =4 = 2(n + 1) i i =4 n X 1 i =4 i ! i + 5−n 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau 6−n + i 3 + Seite 35 / 38 ! (n + 1)(6 − n) 2 − 3n n (n + 1)(6 − n) − 6 3n 1 5n − n2 + i 3n n+1 X 1 i =4 + 2n n X 1 Beweis (Fortsetzung) n+1 2 n+1 QS(n) = 2 − + n+1 n n = 2(n + 1) = 2(n + 1) 1 + n+1 n+1 X 1 i =4 = 2(n + 1) n+1 X i =4 = 2(n + 1) i i =4 n X 1 i =4 i ! i + 5−n 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau 6−n + i 3 + Seite 35 / 38 ! (n + 1)(6 − n) 2 − 3n n (n + 1)(6 − n) − 6 3n 1 5n − n2 + i 3n n+1 X 1 i =4 + 2n n X 1 Beweis (Fortsetzung) n+1 2 n+1 QS(n) = 2 − + n+1 n n = 2(n + 1) = 2(n + 1) 1 + n+1 n+1 X 1 i =4 = 2(n + 1) n+1 X i =4 = 2(n + 1) i i =4 n X 1 i =4 i ! i + 5−n 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau 6−n + i 3 + Seite 35 / 38 ! (n + 1)(6 − n) 2 − 3n n (n + 1)(6 − n) − 6 3n 1 5n − n2 + i 3n n+1 X 1 i =4 + 2n n X 1 Beweis (Fortsetzung) n+1 2 n+1 QS(n) = 2 − + n+1 n n = 2(n + 1) = 2(n + 1) 1 + n+1 n+1 X 1 i =4 = 2(n + 1) n+1 X i =4 = 2(n + 1) i i =4 n X 1 i =4 i ! i + 5−n 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau 6−n + i 3 + Seite 35 / 38 ! (n + 1)(6 − n) 2 − 3n n (n + 1)(6 − n) − 6 3n 1 5n − n2 + i 3n n+1 X 1 i =4 + 2n n X 1 Beweis (Fortsetzung) n+1 2 n+1 QS(n) = 2 − + n+1 n n = 2(n + 1) = 2(n + 1) 1 + n+1 n+1 X 1 i =4 = 2(n + 1) n+1 X i =4 = 2(n + 1) i i =4 n X 1 i =4 i ! i + 5−n 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau 6−n + i 3 + Seite 35 / 38 ! (n + 1)(6 − n) 2 − 3n n (n + 1)(6 − n) − 6 3n 1 5n − n2 + i 3n n+1 X 1 i =4 + 2n n X 1 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1) (Hn+1 − 2) + 2. = 2(n + 1)Hn+1 − 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1) (Hn+1 − 2) + 2. = 2(n + 1)Hn+1 − 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1) (Hn+1 − 2) + 2. = 2(n + 1)Hn+1 − 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1) (Hn+1 − 2) + 2. = 2(n + 1)Hn+1 − 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1)Hn+1 − = 2(n + 1) (Hn+1 − 2) + 2. 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Mittels der Harmonischen Zahlen Hk = k X 1 i =1 erhält man QS(n) = 2(n + 1) n+1 X 1 + i 5−n 3 i i =4 1 1 5−n = 2(n + 1) Hn+1 − 1 − − + 2 3 3 11 5 − n = 2(n + 1)Hn+1 − 2(n + 1) + 6 3 22n + 22 − 10 + 2n = 2(n + 1)Hn+1 − 6 12n + 6 = 2(n + 1) (Hn+1 − 2) + 2. = 2(n + 1)Hn+1 − 3 Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 36 / 38 Quicksort - Average-Case Satz Quicksort sortiert n Elemente im Mittel mit 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS ≤ 2(n + 1) ln(n + 1) − 2n Vergleichen und Θ(n log n) sonstigen Operationen. D.h. insbesondere QS(n) = Θ(n log n). Beweis Aus QS(n) = 2(n + 1)(Hn+1 − 2) + 2 ergibt sich 2(n + 1) (ln(n + 2) − 2) + 2 ≤ 2(n + 1) ln(n + 1) − 4(n + 1) + 2 ≤ 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS(n) ≤ 2(n + 1) (1 + ln(n + 1) − 2) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2(n + 1) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 37 / 38 Quicksort - Average-Case Satz Quicksort sortiert n Elemente im Mittel mit 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS ≤ 2(n + 1) ln(n + 1) − 2n Vergleichen und Θ(n log n) sonstigen Operationen. D.h. insbesondere QS(n) = Θ(n log n). Beweis Aus QS(n) = 2(n + 1)(Hn+1 − 2) + 2 ergibt sich 2(n + 1) (ln(n + 2) − 2) + 2 ≤ 2(n + 1) ln(n + 1) − 4(n + 1) + 2 ≤ 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS(n) ≤ 2(n + 1) (1 + ln(n + 1) − 2) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2(n + 1) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 37 / 38 Quicksort - Average-Case Satz Quicksort sortiert n Elemente im Mittel mit 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS ≤ 2(n + 1) ln(n + 1) − 2n Vergleichen und Θ(n log n) sonstigen Operationen. D.h. insbesondere QS(n) = Θ(n log n). Beweis Aus QS(n) = 2(n + 1)(Hn+1 − 2) + 2 ergibt sich 2(n + 1) (ln(n + 2) − 2) + 2 ≤ 2(n + 1) ln(n + 1) − 4(n + 1) + 2 ≤ 2(n + 1) ln(n + 1) − 4n − 2 ≤ QS(n) ≤ 2(n + 1) (1 + ln(n + 1) − 2) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2(n + 1) + 2 QS(n) ≤ 2(n + 1) ln(n + 1) − 2n Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 37 / 38 Weiter geht es mit Heapsort Algorithmen und Datenstrukturen SS09 M. Brinkmeier TU Ilmenau Seite 38 / 38