|
Der RadixSort, auch DistributionSort oder auch BucketSort genannt, ist ein erstaunlich schnelles Sortierverfahren O(n), welches nicht auf Vergleichen zwischen den Schlüsselwerten der Elemente beruht, sondern die Schlüsselwerte der Elemente auf Indexwerte eines temporären Array abbildet. Intern sortiert RadixSort des Öfteren beispielsweise viermal, wobei die Schlüsselwerte dementsprechend partiell abgebildet werden. Ein interner Sortiervorgang besteht aus zwei Phasen:
Damit die Ordnung der vorhergehenden Sortiervorgänge nicht verloren geht, muss jeder interne Soritervorgang stabil sein, siehe hierzu Sortieren. Dieses Sortierverfahren hat aber einen Haken: Sortierverfahren, die auf Vergleichen beruhen, benötigen lediglich eine Schlüsselvergleichsfunktion zum jeweiligen Schlüsseltyp, welche dem Sortieralgorithmus je nach Schlüsseltyp bequem übergeben werden kann. Kommt beispielsweise im Laufe des Wandels ein neuer Schlüsseltyp zu einer Anwendung hinzu, so muss lediglich eine dazugehörige Vergleichsfunktion beigefügt, nicht aber die Struktur des Algorithmus angepasst werden. Beim RadixSort muss allerdings der Algorithmus auf den jeweiligen Schlüsseltyp zurechtgeschnitten werden, d. h. dass die Struktur des RadixSort−Algorithmus immer von der Domäne bzw. vom Typ insbesondere vom Wertebereich der Schlüssel abhängt. Beispielsweise sieht der RadixSort−Algorithmus für vorzeichenbehaftete Integer−Schlüssel anders aus als der für vorzeichenlose und der für Integer−Schlüssel anders als der für String−Schlüssel, usw. Dennoch ist es vorstellbar einen generischen RadixSort zu entwickeln, jedoch bei einem Versuch den RadixSort zu verallgemeinern, würde der RadixSort erheblich ineffizienter werden. |
|
Dieses Sortierverfahren garantiert in jedem Falle eine Laufzeitkomplexität von O(n), jedoch mit einer verhältnismäßig hohen Konstante c, so dass man eigentlich O(c * n) notieren sollte. Intern führt RadixSort sequenziell gleich mehrere Sortiervorgänge aus, wobei bei jedem einzelnen Sortiervorgang jedes Element mindestens zweimal angefaßt werden muss; einmal in der Partitionierungsphase und einmal in der Sammelphase. RadixSort rentiert sich bei genauerer Betrachtung erst, wenn sehr viele Elemente sortiert werden müssen. Voraussetzung dafür ist, dass der Arbeitsspeicher ausreichend Platz zur Verfügung stellt. Wenn die besagte Konstante c größer sein sollte als log(n), dann sollte auf herkömmliche Verfahren, die auf Vergleichen beruhen, zurückgegriffen werden wie zum Beispiel QuickSort oder MergeSort. Zudem gehört RadixSort nicht zur Klasse der In-Placement-Sortierverfahren, d. h. dass die Sortierung nicht auf dem gegebenen Array ablaufen kann. RadixSort benötigt mindestens so viel Speicherplatz wie die Schlüssel der zu sortierenden Elemente benötigen. |
|
RadixSort wird typischerweise dann angewendet, wenn die zu sortierenden Elemente aus greifbarer Materie und nicht aus (Software−) Information bestehen. In den Frühzeiten des Computerzeitalters als noch Lochkarten zur Programmierung von Rechenanlagen verwendet wurden, gebrauchte man schon den RadixSort, um Lochkarten zu sortieren. Und die Post verwendet den RadixSort, um Briefe bzgl. ihrer Postleitzahlen zu sortieren. |
Fünf Briefe müssen nun bzgl. ihrer Postleitzahlen 94032, 83512, 90459, 56410, 53419 sortiert werden.
|
|
Folgendes Implementierungsbeispiel in C++ zeigt, wie vorzeichenlose 32-Bit-Werte mittels RadixSort sortiert werden können. Die Analogie zum Postleitzahlenbeispiel ist in der Form vorhanden, dass nun nicht nach einzelnen Ziffern der Postleitzahlen, sondern nach einzelnen Bytes der +Integer sortiert wird, der Rest analog! |
|
|
Der begeisterte Leser kann sich ja mal einen RadixSort−Algorithmus für String−Schlüssel überlegen. :−) Bei derartigen Übungen können Sie sich das Konzept des RadixSorts besser verinnerlichen, also wenn das kein Vorteil ist! |
Printversion www.stefan-baur.de / RadixSort zuletzt geändert am Sonntag, den 15. März 2009
Copyright (c) 2004-2010 Stefan K. Baur