3 Lineares Sortieren
Literatur:
Kapitel 9 [CLR90].
Inhalt
O-Notation ·Einführung ·Vergleichssortieren ·Counting sort ·Bucket sort
-
Bisher: die Algorithmen O(nlog n) oder O(n2)
- Gemeinsamkeit:
Die Ordnung die die Algorithen bestimmen, beruht ausschließlich
auf dem Vergleich zwischen Elementen
- Þ
Verfahren |
Tmin |
Tmax |
Tav |
Auswahl |
O(n2) |
O(n2) |
O(n2) |
Einfügen |
O(n) |
O(n2) |
O(n2) |
Bubblesort |
O(n) |
O(n2) |
O(n2) |
Mischen |
O(n log n) |
O(n log n) |
O(nlog n) |
direktes Mischen |
O(n log n) |
O(n log n) |
O(nlog n) |
natürliches Mischen |
O(n) |
O(n log n) |
O(nlog n) |
Quicksort |
O(nlog n) |
O(n2) |
O(nlog n) |
Heapsort |
O(n log n) |
O(n log n) |
O(n log n) |
Table 1: Vergleich
Abschätzung für Vergleichssortieren
|
-
Vorraussetzung: Sortieren einer Sequenz (a1,..., an) (oBdA:
alle Elemente verschieden, wichtig ist nur < oder das Gegenteil.)
- mögliche Eingaben der Länge n: alle Permutationen
- Entscheidungsbaum: Darstellung der
Entscheidungen eines Sortieralgorithmusses
-
interner Knoten: ai:aj wobei 1£ i<j£ n,
repräsentiert den Vergleich von ai mit aj, seine Unterbäume die
Vergleiche, je nachdem wie sein Vergleich ausgefallen ist.
- Blatt: Permutation
- Lauf der Sortierung: Pfad durch den Baum
- Þ Höhe des Baumes @ worst-case der
Vergleiche @ worst-case der Laufzeit
- Folie: insertion sort
Vergleichssortieren: worst-case
|
-
gegeben: Entscheidungsbaum für einen Algorithmus
-
worst-case = Tiefe des Baumes
|
- Þ Abschätzung für die Laufzeit:
Theorem 1 [Untere Schranke für worst-case]
Die Höhe ein Entscheidungsbaums der n Elemente sortiert
besitzt eine asymptotische untere
Schranke der Größe
O(n lg n).
-
Mischsortierung und Heapsort sind asymptotisch
optimal.
Abschätzung der Laufzeit(2)
|
Beweis:[of Theorem 1]
-
Es gibt ³ n! Blätter
- Eigenschaft eines binären Baumes: n! £ 2h, d.h.,
h³ lg(n!) (h ist die Höhe)
- mit Stirling-Approximation n! > ( n/e)n
- Þ h³ n lg n - nlg e
- Þ untere Schranke O(nlg n).
Lineares Sortieren: Counting Sort
|
-
Beispiel für einen Algorithmus, der kein
Vergleichssortieren ist
- man braucht zusätzliche Information
- Counting Sort: Information, daß der Wertebereich der
Elemente endlich ist: 1,..., k mit k
=O(n).
- Þ Zählen der Elemente =i möglich (im
Hilfsarray C[1... k])
- kein Vergleich im Algorithmus
Counting-Sort(A,B,k)
for i := 1 to k do C[i] := 0;
for j := 1 to length[A]
do C[A[j]] := C[A[j]] + 1 /* C[i]: Anzahl der Elemente = i */
for i := 2 to k /* Erlaubter Input von 1...k */
do C[i] := C[i] + C[i-1]; /* C[i]: Anzahl Elemente <= i */
for j := length[A] downto 1
do
B[C[A[j]]] := A[j]; /* C[A[j]] gibt Pos. in B */
C[A[j]] := C[A[j]] - 1;
od;
Analyse von Counting Sort
|
-
erste Schleife: O(k)
- zweite Schleife: O(n)
- dritte Schleife: O(n)
-
Insgesamt: O(k+n), und falls k =O(n) Þ
lineare Laufzeit: O(n)
-
Annahme von Bucketsort: uniforme
Verteilung der Eingabe im Intervall I = [0, 1[
- Teilung von I in n Unterintervalle ( Buckets)
-
Verteilen der Elemente in die Buckets
- Sortieren der Buckets
- Aneinanderhängen der sortierten Teillisten
BucketSort(A)
n := length(A);
for i=1 to n
do insert A[i] into list B[floor (n * A[i])];
for i=0 to n-1
do sort list B[i] with insertion sort;
concatenate lists B[0], B[1], B[n-1] together;
-
Alles linear bis auf Insertionsort
= quadratisch
- Zufallsvariable ni: Anzahl der Elemente in B[i].
- Insertionsort quadratisch Þ erwarteter Gesamtaufwand:
|
|
O ( E(ni2))
=
O |
æ ç ç è |
|
( E(ni2)) |
ö ÷ ÷ ø |
- Verteilung von ni: Binomialverteilung B(k,n,p=1/n)
P(ni = k) = n kpk qn-k
- E(ni) = 1 und Var(ni) = 1- 1/n.
- E(ni2) = Var(ni)+ E(ni)2 = 2 - 1/n = O(1)
- Þ
T(n) = O(n)
February 5, 2002