Algorithmen und Datenstrukturen SS09

Werbung
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
Herunterladen