Counting-Sort

Werbung
10. Sortieren in linarer Zeit
Es gibt Algorithmen, die die Ω(nlog(n)) untere Schranke
für Vergleichssortierer schlagen. Diese Algorithmen
haben Laufzeit O(n).
Diese Algorithmen benutzen neben Vergleichen und
Kontrolloperationen noch andere Operationen, z.B.
arithmetische Operationen auf den zu sortierenden Zahlen.
Außerdem werden noch Annahmen über die zu
sortierenden Zahlen getroffen, um die Laufzeit von O(n)
zu zeigen und die Korrektheit der Algorithmen zu
beweisen.
Zu diesen Algorithmen gehören Counting-Sort,
Bucket-Sort und Radix-Sort.
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
1
Sortieren durch Abzählen (1)
Annahme: Es gibt ein dem Algorithmus Counting-Sort
bekannter Parameter k, so dass für die Eingabefolge
(a1,K ,an ) gilt:
0 ≤ ai ≤ k für alle 1 ≤ i ≤ n .
Algorithmusidee:
1. Für alle i , 0 ≤ i ≤ k bestimme Anzahl Ci der
a j mit a j ≤ i .
2. Kopiere a j mit a j = i in Felder B[Ci −1 + 1],K ,B[Ci ]
eines Arrays B mit length[B]=n. Dabei gilt
C−1 = 0 .
Es gilt: Ci − Ci −1 ist die Anzahl der a j mit a j = i .
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
2
Sortieren durch Abzählen (2)
A
a1
a2
a3
…
a j mit a j = 0
SS 2006
…
…
an −1 an
…
Ci −1 + 1
C0
1
B
a4
Ci
….
Ck
…
a j mit a j = i
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
3
Counting-Sort
Counting - Sort ( A,B,k )
1. for i ← 0 to k
2. do C[i ] ← 0
3. for j ← 1 to length[A]
do C [A[ j ]] ← C[A[ j ]] + 1
4.
5. > C[i ] enthält Anzahl der Elemente in A mit Wert i .
6. for i ← 0 to k
7. do C[i ] ← C[i ] + C [i − 1]
8. > C[i ] enthält Anzahl der Elemente in A mit Wert ≤ i .
9. for j ← length[A] downto 1
10.
do B[C[A[ j ]]] ← A[ j ]
C[A[ j ]] ← C [A[ j ]] − 1
11.
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
4
Illustration für Counting-Sort (1)
A
C
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
0
1
2
3
4
5
2
0
2
3
0
1
0
1
2
3
4
5
2
2
4
7
7
8
(nach Zeilen 3-4)
C
(nach Zeilen 6-7)
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
5
Illustration für Counting-Sort (2)
A
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
1
2
3
C
4
5
0
1
2
3
4
5
2
2
4
7
7
8
6
0
1
2
3
4
5
2
2
4
6
7
8
1
2
3
4
5
6
0
B
C
SS 2006
8
3
B
C
7
7
8
3
0
1
2
3
4
5
1
2
4
6
7
8
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
6
Illustration für Counting-Sort (3)
A
1
2
3
4
5
6
7
8
2
5
3
0
2
3
0
3
1
2
SS 2006
5
6
7
3
3
0
1
2
3
4
5
1
2
4
5
7
8
1
2
3
4
5
6
7
3
3
0
B
C
4
0
B
C
3
2
0
1
2
3
4
5
1
2
3
5
7
8
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
8
8
7
Analyse von Counting-Sort (1)
Counting - Sort ( A,B,k )
1. for i ← 0 to k
2. do C [i ] ← 0
3. for j ← 1 to length[A]
4.
do C[A[ j ]] ← C [A[ j ]] + 1
5. > C [i ] enthält Anzahl der Elemente in A mit Wert i .
6. for i ← 0 to k
7. do C[i ] ← C [i ] + C[i − 1]
8. > C [i ] enthält Anzahl der Elemente in A mit Wert ≤ i .
9. for j ← length[A] downto 1
10.
do B[C [A[ j ]]] ← A[ j ]
11.
C[A[ j ]] ← C [A[ j ]] − 1
Zeilen 1-2, 6-7: jeweils O(k)
Zeilen 3-4, 9-11: jeweils O(n)
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
8
Analyse von Counting-Sort (2)
Satz 10.1: Counting-Sort besitzt Laufzeit O(n+k).
Korollar 10.2: Gilt k= O(n), so besitzt Counting-Sort
Laufzeit O(n).
SS 2006
Datenstrukturen und Algorithmen 10. Sortieren in linearer Zeit
9
Herunterladen