Radixsort

Radixsort

Radixsort (von lat. Wurzel, Basis) oder auch Distributionsort (von engl. Distribution – „Verteilung“), oder im Deutschen Fachverteilen, ist ein lineares, stabiles Sortierverfahren, das out-of-place arbeitet und auf Countingsort basiert. Das Sortierverfahren hat unter der Voraussetzung, dass die maximale Länge der zu sortierenden Schlüssel von vornherein bekannt ist, lineare Laufzeit (abhängig von der Anzahl der Elemente, die zu sortieren sind).

Inhaltsverzeichnis

Voraussetzungen

Bei Radixsort wird davon ausgegangen, dass die Schlüssel der zu sortierenden Daten nur aus Zeichen eines endlichen Alphabets bestehen. Zusätzlich muss eine Totalordnung zwischen den Zeichen des Alphabets bestehen.

Eine zweite Voraussetzung ist, dass die Länge der Schlüssel durch eine (von vornherein bekannte) Konstante begrenzt ist, da die Anzahl der Stellen pro Schlüssel eine entscheidende Auswirkung auf die Linearität des Laufzeitverhaltens hat.

Vorgehensweise

Radixsort besteht aus zwei Phasen, die immer wieder abwechselnd durchgeführt werden. Die Partitionierungsphase dient dazu, die Daten auf Fächer aufzuteilen, während in der Sammelphase die Daten aus diesen Fächern wieder aufgesammelt werden. Beide Phasen werden für jede Stelle der (zu sortierenden) Schlüssel einmal durchgeführt.

Partitionierungsphase 
In dieser Phase werden die Daten in die vorhandenen Fächer aufgeteilt, wobei für jedes Zeichen des zugrundeliegenden Alphabets ein Fach zur Verfügung steht. In welches Fach der gerade betrachtete Schlüssel gelegt wird, wird durch das an der gerade betrachteten Stelle stehende Zeichen bestimmt. So wird zum Beispiel die Zahl 352 in das Fach 3 gelegt, wenn gerade die dritte Stelle (von hinten) betrachtet wird.
Sammelphase 
Nach der Aufteilung der Daten in Fächer in Phase 1 werden die Daten wieder eingesammelt und auf einen Stapel gelegt. Hierbei wird so vorgegangen, dass zuerst alle Daten aus dem Fach mit der niedrigsten Wertigkeit eingesammelt werden, wobei die Reihenfolge der darin befindlichen Elemente nicht verändert werden darf. Danach werden die Elemente des nächsthöheren Faches eingesammelt und an die schon aufgesammelten Elemente angefügt. Dies führt man fort bis alle Fächer wieder geleert wurden.

Diese beiden Phasen werden nun für jede Stelle der Schlüssel wiederholt, wobei mit der letzten Stelle begonnen wird und in der letzten Iteration die erste Stelle zum Aufteilen verwendet wird. Nach dem Aufsammeln für die erste Stelle der Schlüssel sind die Daten aufsteigend sortiert.

Beispiel

Es sollen folgende Zahlen geordnet werden:

124, 523, 483, 128, 923, 584

Zunächst wird nach der letzten Stelle geordnet.

Es beginnt die Partitionierungsphase:

|0| |1| |2| |3| |4| |5| |6| |7| |8| |9|
             |   |               |
            523 124             128
            483 584 
            923

Es folgt die Sammelphase (Elemente von links nach rechts, von oben nach unten aufsammeln):

523, 483, 923, 124, 584, 128

Nun nach der mittleren Stelle (im Allgemeinen von rechts nach links jeweils eine Stelle weiter).

Erneute Partitionierungsphase:

|0| |1| |2| |3| |4| |5| |6| |7| |8| |9|
         |                       |
        523                     483
        923                     584
        124
        128

Nun eine zweite Sammelphase:

523, 923, 124, 128, 483, 584

Und jetzt wird nach der ersten Stelle geordnet.

Die letzte Partitionierungsphase:

|0| |1| |2| |3| |4| |5| |6| |7| |8| |9|
     |           |   |               |
    124         483 523             923
    128             584

Es folgt die letzte Sammelphase:

124, 128, 483, 523, 584, 923

Die Zahlen sind nun aufsteigend sortiert.

Implementierung

Java-Methode zum Sortieren von Integer-Arrays:

// Achtung: Integer ist in Java immer vorzeichenbehaftet (=signed).
// Der folgende Code sortiert jedoch so, als ob der Datentyp int kein Vorzeichen hätte (=unsigned)
// und funktioniert daher in Java nur bei positiven Zahlen.
 
 public static void radixSort(int[] a) {
     int     n;                             // Fachnummer
     int[]   nPart = new int[2];            // Anzahl der Elemente in den beiden Faechern
     int[][] part  = new int[2][a.length];  // die beiden Faecher haben die Groesse des Arrays a
 
     // Schleife ueber alle Bits der Schluessel (bei int: 32 Bit)
     for (int i=0; i<32; i++) {
         nPart[0] = 0;
         nPart[1] = 0;
 
         // Partitionierungsphase: teilt "a" auf die Faecher auf
         for (int j=0; j<a.length; j++) {
             n = (a[j]>>i)&1;              // ermittelt die Fachnummer: 0 oder 1                   
             part[n][nPart[n]++] = a[j];   // kopiert j-tes Element ins richtige Fach
         }
 
         // Sammelphase: kopiert die beiden Faecher wieder nach "a" zusammen
         System.arraycopy(part[0], 0, a, 0,        nPart[0]);
         System.arraycopy(part[1], 0, a, nPart[0], nPart[1]);
     }
 }

Laufzeit

Die Laufzeit des Algorithmus lässt sich durch O(m \cdot n) abschätzen, wobei m die maximale Länge eines Schlüssels und n die Anzahl der zu sortierenden Elemente bezeichnen. Nimmt man nun an, dass m konstant ist, folgt daraus, dass dieses Sortierverfahren linear ist. Allerdings ist in der Praxis O(nlog n) eine bessere Abschätzung, da mit einer höheren Anzahl an Elementen für gewöhnlich auch die Schlüssellänge zunimmt. Dabei ist logn eine gute Abschätzung für die Länge der Schlüssel von n Elementen.

Siehe auch

Weblinks


Wikimedia Foundation.

Игры ⚽ Поможем написать реферат

Schlagen Sie auch in anderen Wörterbüchern nach:

  • Distributionsort — Radixsort (von lat. Wurzel, Basis) oder auch Distributionsort (von engl. Distribution – „Verteilung“), oder im Deutschen Fachverteilen, ist ein lineares, stabiles Sortierverfahren, das out of place arbeitet und auf Countingsort basiert. Das… …   Deutsch Wikipedia

  • Fachverteilen — Radixsort (von lat. Wurzel, Basis) oder auch Distributionsort (von engl. Distribution – „Verteilung“), oder im Deutschen Fachverteilen, ist ein lineares, stabiles Sortierverfahren, das out of place arbeitet und auf Countingsort basiert. Das… …   Deutsch Wikipedia

  • Fachverteilung — Radixsort (von lat. Wurzel, Basis) oder auch Distributionsort (von engl. Distribution – „Verteilung“), oder im Deutschen Fachverteilen, ist ein lineares, stabiles Sortierverfahren, das out of place arbeitet und auf Countingsort basiert. Das… …   Deutsch Wikipedia

  • Radix sort — Radixsort (von lat. Wurzel, Basis) oder auch Distributionsort (von engl. Distribution – „Verteilung“), oder im Deutschen Fachverteilen, ist ein lineares, stabiles Sortierverfahren, das out of place arbeitet und auf Countingsort basiert. Das… …   Deutsch Wikipedia

  • Ordenamiento Radix — En informática, el ordenamiento Radix (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas)… …   Wikipedia Español

  • Sortieralgorithmen — Ein Sortierverfahren ist ein Algorithmus, der dazu dient, eine Liste von Elementen zu sortieren. Voraussetzung ist, dass auf der Menge der Elemente eine strenge schwache Ordnung definiert ist, z. B. die lexikographische Ordnung von Zeichenketten… …   Deutsch Wikipedia

  • Sortieralgorithmus — Ein Sortierverfahren ist ein Algorithmus, der dazu dient, eine Liste von Elementen zu sortieren. Voraussetzung ist, dass auf der Menge der Elemente eine strenge schwache Ordnung definiert ist, z. B. die lexikographische Ordnung von Zeichenketten… …   Deutsch Wikipedia

  • Stabil (Sortierverfahren) — Ein stabiles Sortierverfahren ist ein Sortieralgorithmus, der die Reihenfolge der Datensätze, deren Sortierschlüssel gleich sind, bewahrt. Wenn beispielsweise eine Liste alphabetisch sortierter Personendateien nach dem Geburtsdatum neu sortiert… …   Deutsch Wikipedia

  • Stabiles Sortierverfahren — Ein stabiles Sortierverfahren ist ein Sortieralgorithmus, der die Reihenfolge der Datensätze, deren Sortierschlüssel gleich sind, bewahrt. Wenn beispielsweise eine Liste alphabetisch sortierter Personendateien nach dem Geburtsdatum neu sortiert… …   Deutsch Wikipedia

  • Merge sort — Example of merge sort sorting a list of random dots. Class Sorting algorithm Data structure Array Worst case performance O(n log n) …   Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”