Bucketsort
Bucketsort (von engl. bucket „Eimer“) ist ein Sortierverfahren, das für bestimmte Werte-Verteilungen eine Eingabe-Liste in linearer Zeit sortiert. Der Algorithmus ist in drei Phasen eingeteilt:
- Verteilung der Elemente auf die Buckets (Partitionierung)
- Jeder Bucket wird mit einem weiteren Sortierverfahren, wie beispielsweise Insertionsort sortiert.
- Der Inhalt der sortierten Buckets wird konkateniert.
Das Verfahren arbeitet also out-of-place.
Inhaltsverzeichnis |
Algorithmus [Bearbeiten]
Die Eingabe von Bucketsort ist eine Liste mit
Elementen und eine Funktion
, die jedes Element der Liste in das Intervall
abbildet. Die Ausgabe ist eine sortierte Liste, wobei
den Sortierschlüssel von einem Element
berechnet. Während der Sortierung verwendet der Algorithmus
„Buckets“, die in einem Array angeordnet sind. Die Verteilung der Elemente geschieht über dieses Array, indem jedes Element
in den
-ten Bucket gelegt wird. Danach wird nacheinander jeder Bucket sortiert. In der letzten Phase werden die Bucket-Listen in der Reihenfolge, wie sie im Array angeordnet sind, konkateniert, was als Ergebnis die sortierte Ausgabe darstellt.
Als Pseudo-Code:
bucket_sort(l, f) n = l.size buckets = array(n) foreach (e in l) buckets[ floor(f(e) * n) ].add(e) r = [] foreach (b in buckets) x = insertion_sort(b) r.append(x) return r
Der Algorithmus sortiert stabil, wenn der für die Sortierung der Buckets verwendete Sortier-Algorithmus, hier insertion_sort, stabil ist.
Komplexität [Bearbeiten]
Die Verteilung der Funktionswerte von
bestimmt die Laufzeit von Bucketsort. Die Laufzeit ist in
(in O-Notation), wobei
die Anzahl der Elemente im
-ten Bucket bezeichnet. Bei einer Gleichverteilung ist die Gesamtlaufzeit
, da auch die Summe der Quadrate der Bucketgrößen linear ist. Intuitiv ist dies direkt einsehbar, da bei einer Gleichverteilung von
Elementen auf
Buckets jeder Bucket im Erwartungsfall eine konstante Anzahl von Elementen enthält und damit eine Sortierkomplexität von
erzeugt. Die effiziente Laufzeit von
ist nicht nur bei einer Gleichverteilung gegeben, sondern bei allen Verteilungen, nach denen der Summenterm asymptotisch linear ist.
Bei anderen Werte-Verteilungen wird die Laufzeit des Bucketsortalgorithmus von der Laufzeit des Sortier-Algorithmus dominiert, der zur Sortierung eines Buckets verwendet wird. Ein solcher Worst-Case tritt ein, wenn beispielsweise alle Elemente in genau einem Bucket zugeordnet werden. Bei Verwendung von Insertion-Sort für die Sortierung der Buckets wäre die Gesamtlaufzeit damit in
.
Falls die Werte bei jedem Bucketsort-Aufruf bzw. über alle Aufrufe hinweg entsprechend verteilt sind, ist die effiziente Laufzeit von
eine Worst-Case- bzw. Average-Case-Laufzeit.
Der Speicherbedarf liegt in
.
Literatur [Bearbeiten]
- Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Introduction to Algorithms. 2. Auflage. MIT Press, Cambridge (Massachusetts) 2001, ISBN 0-262-03293-7, S. 174.
- Donald Ervin Knuth: The Art of Computer Programming: Volume 3 Sorting and Searching. 2. Auflage. Addison-Wesley, Reading, Mass. 1997, ISBN 0-201-89685-0, S. 169.
- Apostolos Burnetas und Daniel Solow und Rishi Agarwal: An analysis and implementation of an efficient in-place bucket sort. In: Acta Informatica. 34, Nr. 9, 1997, S. 687-700, doi:10.1007/s002360050103 (Die Bucketsort-Variante wird als Groupsort bezeichnet).
- E. J. Isaac und R. C. Singleton: Sorting by Address Calculation. In: Journal of the ACM. 3, Nr. 3, Juli 1956, S. 169-174, doi:10.1145/320831.320834.
Siehe auch [Bearbeiten]
- Hybridsort, ein Sortierverfahren, das die Eigenschaften von Bucketsort und Heapsort kombiniert.
- Countingsort
- Radixsort