Menu
Coddy logo textTech

Radix Sort

Zuletzt aktualisiert

Radix Sort ist ein vergleichsfreies Sortierverfahren für ganze Zahlen. Statt Werte zu vergleichen, sortiert es Zahlen Ziffer für Ziffer. Die Least-Significant-Digit-Variante (LSD) verarbeitet zuerst die Einerstelle, dann die Zehner, dann die Hunderter und verwendet bei jeder Ziffer ein stabiles Counting Sort. Da jeder Durchlauf stabil ist, ist das gesamte Array sortiert, sobald die höchstwertige Ziffer verarbeitet wurde. Drücke oben auf Abspielen, um zu sehen, wie jeder Ziffern-Durchlauf die Balken neu anordnet.

Radix Sort läuft in O(d·(n + k)) Zeit, wobei d die Anzahl der Ziffern und k die Basis ist (hier 10). Für Ganzzahlen fester Breite ist das praktisch linear - es kann Vergleichssortierungen mit O(n log n) schlagen - funktioniert aber nur mit Daten, die sich in Ziffern oder Schlüssel zerlegen lassen.

Zeit- und Speicherkomplexität

FallKomplexitätAnmerkungen
ZeitO(d·(n + k))d Ziffern, Basis k (linear bei festem d)
SpeicherO(n + k)Ausgabe-Array + Ziffernzählungen
StabilJaJeder Ziffern-Durchlauf ist ein stabiles Counting Sort
Vergleichend?NeinSortiert nach Ziffer, nicht durch Wertevergleich
Funktioniert aufGanzzahlen/SchlüsselnNicht auf allgemeinen vergleichbaren Objekten

Schritt für Schritt

SchrittWas passiert
1Den Maximalwert ermitteln, um zu wissen, wie viele Ziffern zu verarbeiten sind.
2Mit der niederwertigsten Ziffer beginnen (der Einerstelle).
3Das Array stabil nach dieser Ziffer mit Counting Sort sortieren.
4Zur nächsten höherwertigen Ziffer wechseln.
5Wiederholen, bis alle Ziffernpositionen verarbeitet sind.

Durchgerechnetes Beispiel

Sortieren von [170, 45, 75, 90, 2, 24, 66]:

DurchlaufArrayAktion
Start[170, 45, 75, 90, 2, 24, 66]Das Maximum ist 170, daher sind drei Ziffern-Durchläufe nötig.
Einer[170, 90, 2, 24, 45, 75, 66]Stabiles Sortieren nach der Einerstelle: 0, 0, 2, 4, 5, 5, 6.
Zehner[2, 24, 45, 66, 170, 75, 90]Stabiles Sortieren nach der Zehnerstelle: 0, 2, 4, 6, 7, 7, 9 (170 behält seinen Vorsprung vor 75).
Hunderter[2, 24, 45, 66, 75, 90, 170]Stabiles Sortieren nach der Hunderterstelle; nur 170 hat eine 1 und rückt daher ans Ende. Sortiert.

Wann Radix Sort verwenden

Verwenden, wennVermeiden, wenn
Die Schlüssel Ganzzahlen oder Zeichenketten fester Länge sind, die du in Ziffern zerlegen kannst.Du beliebige Objekte mit einem eigenen Vergleicher sortieren musst.
Die Schlüssel eine kleine, beschränkte Ziffernanzahl d haben, sodass O(d·(n + k)) O(n log n) schlägt.Die Schlüssel sehr lang oder unbeschränkt sind, wodurch d groß und die Durchläufe teuer werden.
Du eine stabile Sortierung brauchst und dir O(n + k) zusätzlichen Speicher leisten kannst.Der Speicher knapp ist und die O(n + k)-Puffer nicht vertretbar sind.
Der Wertebereich oder die Basis k im Verhältnis zu n moderat ist.k riesig ist, sodass jeder Counting-Sort-Durchlauf die Laufzeit dominiert.

Radix Sort-Code

Eine saubere, lauffähige Radix Sort-Implementierung in Python, JavaScript, Java, C++, C. Wähle eine Sprache, kopiere den Code oder öffne ihn vorgeladen im Coddy-Playground.

Radix Sort-Code in Python

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
Führe diesen Code im Python-Playground aus

Radix Sort FAQ

Wie ist die Zeitkomplexität von Radix Sort?
Radix Sort ist O(d·(n + k)), wobei d die Anzahl der Ziffern und k die Basis ist. Für Ganzzahlen fester Breite ist das praktisch O(n), was schneller sein kann als Vergleichssortierungen. Es benötigt O(n + k) zusätzlichen Speicher.
Ist Radix Sort stabil?
Ja. LSD-Radix-Sort stützt sich bei jeder Ziffer auf ein stabiles Counting Sort; diese Stabilität sorgt dafür, dass der ziffernweise Ansatz ein korrekt sortiertes Ergebnis liefert.
Wann kann ich Radix Sort verwenden?
Radix Sort funktioniert mit Daten, die sich in Ziffern oder Schlüssel fester Größe zerlegen lassen, etwa Ganzzahlen oder Zeichenketten fester Länge. Es ist keine universelle Vergleichssortierung und kann daher keine beliebigen Objekte mit einem eigenen Vergleicher sortieren.
Wie unterscheidet sich Radix Sort von Counting Sort?
Counting Sort sortiert in einem Durchlauf nach einem einzigen Schlüssel und benötigt ein Zähl-Array so groß wie der Wertebereich, weshalb es bei weit gestreuten Werten verkommt. Radix Sort wendet Counting Sort ziffernweise an und hält das Zähl-Array jedes Durchlaufs klein (Basis k), wodurch es große Wertebereiche bewältigen kann, die einfaches Counting Sort nicht schaffen würde.
Warum beginnt LSD-Radix-Sort mit der niederwertigsten Ziffer?
Der Beginn mit der niederwertigsten Ziffer erlaubt es jedem stabilen Durchlauf, die von allen früheren, niederwertigeren Ziffern hergestellte Ordnung zu bewahren. Wenn die höchstwertige Ziffer verarbeitet wird, sind Gleichstände bei dieser Ziffer bereits durch die niedrigeren Ziffern korrekt geordnet, sodass das Array am Ende vollständig sortiert ist. Zuerst nach der höchstwertigen Ziffer zu sortieren, würde dies zerstören und einen anderen, rekursiven Ansatz erfordern (MSD-Radix-Sort).
Kann Radix Sort mit negativen Zahlen umgehen?
Nicht direkt - die grundlegende Ziffernextraktion setzt nicht-negative Ganzzahlen voraus. Übliche Lösungen sind, alle Werte durch Addition des Minimums zu verschieben, damit alles nicht-negativ ist, oder Negative und Nicht-Negative getrennt zu sortieren und dann zu verketten. Das zu ignorieren ist ein häufiger Fehler, wenn man Radix Sort auf reale Daten anwendet.
Coddy programming languages illustration

Meistere Algorithmen mit Coddy

LOS GEHT'S