Radix-Sortierung
- Radix-Sortieralgorithmus
- Radix-Sortierbeispiel
- Implementierung des Radix-Sortieralgorithmus
- Radix-Sortieralgorithmus Komplexität
Radix sort ist ein nicht-komparativer Sortieralgorithmus. Dieser Algorithmus vermeidet Vergleiche, indem er Elemente entsprechend der Radix
(Radix/Base ist die Anzahl der eindeutigen Ziffern, die zur Darstellung von Zahlen verwendet werden) in Buckets einfügt. Dezimalzahlen haben z. B. zehn eindeutige Ziffern). Es sortiert Elemente basierend auf den Ziffern der einzelnen Elemente. Es führt eine Zählsortierung der Ziffern von der niedrigstwertigen Ziffer bis zur höchstwertigen Ziffer durch. Sie wird auch als Bucket-Sort oder digitale Sortierung bezeichnet und ist auf Parallelmaschinen sehr nützlich.
Radix-Sortieralgorithmus
Nehmen wir an, dass wir ein unsortiertes Array A[]
mit n
Elementen haben.
-
Finden Sie das größte Element
maxm
im Array. -
Sortieren Sie jede Stelle in
maxm
beginnend mit der niedrigsten Wertigkeit unter Verwendung eines stabilen Sortieralgorithmus.
Radix-Sortierbeispiel
Angenommen, wir haben das Array: (1851, 913, 1214, 312, 111, 23, 41, 9)
. Wir werden es mit dem Radix-Sortieralgorithmus sortieren.
Index | Eingabe Array | Erste Iteration | Zweite Iteration | Dritte Iteration | Vierte Iteration |
---|---|---|---|---|---|
0 | 1851 | 1851 | 0009 | 0009 | 0009 |
1 | 0913 | 0111 | 0111 | 0023 | 0023 |
2 | 1214 | 0041 | 0312 | 0041 | 0041 |
3 | 0312 | 0312 | 0913 | 0111 | 0111 |
4 | 0111 | 0913 | 1214 | 1214 | 0312 |
5 | 0023 | 0023 | 0023 | 0312 | 0913 |
6 | 0041 | 1214 | 0041 | 1851 | 1214 |
7 | 0009 | 0009 | 1851 | 0913 | 1851 |
In der ersten Iteration sortieren wir nach der Einerstelle und bewegen uns dann zur Zehner-, Hunderter- und Tausenderstelle, um das endgültige sortierte Array als 9, 23, 41, 111, 312, 913, 1214, 1851
zu erhalten.
Implementierung des Radix-Sortieralgorithmus
#include <iostream>
using namespace std;
const int N = 10;
int maxm(int arr[], int n) {
int max = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > max) {
max = arr[i];
}
}
return max;
}
void countingSort(int arr[], int n, int place) {
int output[n];
int count[N];
for (int i = 0; i < N; ++i) count[i] = 0;
for (int i = 0; i < n; i++) count[(arr[i] / place) % 10]++;
for (int i = 1; i < N; i++) count[i] += count[i - 1];
for (int i = n - 1; i >= 0; i--) {
output[count[(arr[i] / place) % 10] - 1] = arr[i];
count[(arr[i] / place) % 10]--;
}
for (int i = 0; i < n; i++) arr[i] = output[i];
}
void radixsort(int arr[], int n) {
int max = maxm(arr, n);
for (int place = 1; max / place > 0; place *= 10) countingSort(arr, n, place);
}
int main() {
int n = 5;
int arr[5] = {1851, 913, 1214, 312, 111};
cout << "Input arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
radixsort(arr, n); // Sort elements in ascending order
cout << "Output arr: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << "\n";
}
Radix-Sortieralgorithmus Komplexität
Zeitkomplexität
- Durchschnittlicher Fall
Radixsort hat eine Zeitkomplexität von O(n + b)
, wobei b
der Bereich der Eingabe ist. Wenn es d
Ziffern im maximalen Element maxm
gibt, dann wird die Zeitkomplexität von Radix Sort O(d*(n + b))
. Da d und b normalerweise klein sind, liegt die Zeitkomplexität in der Größenordnung von [Big Theta]: O(n)
.
- Schlimmster Fall
Die Zeitkomplexität im schlimmsten Fall ist [Big O]: O(n)
.
- Bester Fall
Die Zeitkomplexität im besten Fall ist [Big Omega]: O(n)
. Sie ist identisch mit der Zeitkomplexität im schlimmsten Fall.
Raumkomplexität
Die Raumkomplexität für den Radix-Sortieralgorithmus ist O(n+b)
, wobei b
der Bereich der Eingabe ist. Sie ergibt sich aus den Arrays count
& output
in der Radixsort. Manchmal kann b größer als n sein, so dass die Komplexität nicht linear ist.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn