Radix Sort Algorithm in Data Structure
Co je Radix Sort Algorithm?
Radix Sort je nesrovnรกvacรญ tลรญdicรญ algoritmus. Funguje tak, ลพe seskupuje jednotlivรฉ ฤรญslice prvkลฏ, kterรฉ majรญ bรฝt seลazeny. Stabilnรญ technika tลรญdฤnรญ se pak pouลพรญvรก k uspoลรกdรกnรญ prvkลฏ na zรกkladฤ jejich radixu. Jednรก se o lineรกrnรญ tลรญdicรญ algoritmus.
Proces tลรญdฤnรญ zahrnuje nรกsledujรญcรญ vlastnosti:
- Nalezenรญ maximรกlnรญho prvku a zรญskรกnรญ poฤtu ฤรญslic tohoto prvku. Udรกvรก nรกm poฤet iteracรญ, kterรฉ bude proces ลazenรญ nรกsledovat.
- Seskupte jednotlivรฉ ฤรญslice prvkลฏ na stejnรฉ vรฝznamnรฉ pozici v kaลพdรฉ iteraci.
- Proces seskupovรกnรญ zaฤne od nejmรฉnฤ vรฝznamnรฉ ฤรญslice a skonฤรญ na nejvyลกลกรญ vรฝznamnรฉ ฤรญslici.
- ลazenรญ prvkลฏ na zรกkladฤ ฤรญslic na tรฉto vรฝznamnรฉ pozici.
- Zachovรกnรญ relativnรญho poลadรญ prvkลฏ, kterรฉ majรญ stejnou hodnotu klรญฤe. Tato vlastnost radix sort z nฤj dฤlรก stabilnรญ sortu.
Koneฤnรก iterace nรกm poskytne zcela seลazenรฝ seznam.
Fungovรกnรญ Radix Sort Algorithmu

Zkusme seลadit seznam celรฝch ฤรญsel na vรฝลกe uvedenรฉm obrรกzku ve vzestupnรฉm poลadรญ pomocรญ algoritmu Radix Sort.
Zde jsou kroky k provedenรญ procesu Radix Sorting:
Krok 1) Identifikujte prvek s maximรกlnรญ hodnotou v seznamu. V tomto pลรญpadฤ je to 835.
Krok 2) Vypoฤรญtejte poฤet ฤรญslic maximรกlnรญho prvku. 835 mรก pลesnฤ 3 ฤรญslice.
Krok 3) Urฤete poฤet iteracรญ na zรกkladฤ kroku 2. 835 mรก 3 ฤรญslice, coลพ znamenรก, ลพe poฤet iteracรญ bude 3.
Krok 4) Urฤete zรกkladnu prvkลฏ. Protoลพe se jednรก o desรญtkovou soustavu, zรกklad bude 10.
Krok 5) Spusลฅte prvnรญ iteraci.
a) Prvnรญ iterace

V prvnรญ iteraci uvaลพujeme jednotkovou hodnotu kaลพdรฉho prvku.
Krok 1) Upravte celรฉ ฤรญslo o 10, abyste zรญskali jednotkovรฉ mรญsto prvkลฏ. Napลรญklad 623 mod 10 nรกm dรกvรก hodnotu 3 a 248 mod 10 nรกm dรกvรก 8.
Krok 2) Pouลพijte ลazenรญ poฤรญtรกnรญ nebo jakรฉkoli jinรฉ stabilnรญ ลazenรญ k uspoลรกdรกnรญ celรฝch ฤรญsel podle jejich nejmรฉnฤ vรฝznamnรฉ ฤรญslice. Jak je vidฤt z obrรกzku, 248 padne na 8. kbelรญk. 623 padne na 3. kbelรญk a tak dรกle.
Po prvnรญ iteraci nynรญ seznam vypadรก takto.

Jak mลฏลพete vidฤt z vรฝลกe uvedenรฉho obrรกzku, seznam jeลกtฤ nenรญ seลazenรฝ a vyลพaduje vรญce iteracรญ, aby byl plnฤ seลazen.
b) Druhรก iterace

V tรฉto iteraci budeme uvaลพovat ฤรญslici na 10th mรญsto pro proces tลรญdฤnรญ.
Krok 1) Vydฤlte celรก ฤรญsla 10. 248 dฤleno 10 nรกm dรกvรก 24.
Krok 2) Upravte vรฝstup z kroku 1 o 10. 24 mod 10 nรกm dรกvรก 4.
Krok 3) Postupujte podle kroku 2 z pลedchozรญ iterace.
Po druhรฉ iteraci nynรญ seznam vypadรก takto

Z vรฝลกe uvedenรฉho obrรกzku mลฏลพete vidฤt, ลพe seznam stรกle nenรญ รบplnฤ seลazen, protoลพe zatรญm nenรญ ve vzestupnรฉm poลadรญ.
c) Tลetรญ iterace

Pro koneฤnou iteraci chceme zรญskat nejvรฝznamnฤjลกรญ ฤรญslici. V tomto pลรญpadฤ je to 100th mรญsto pro kaลพdรฉ z celรฝch ฤรญsel v seznamu.
Krok 1) Vydฤlte celรก ฤรญsla 100โฆ 415 dฤleno 100 nรกm dรกvรก 4.
Krok 2) Modifikujte vรฝsledek z kroku 1 o 10. 4 mod 10 nรกm dรกvรก opฤt 4.
Krok 3) Postupujte podle kroku 3 z pลedchozรญ iterace.
Jak vidรญme, seznam je nynรญ ลazen vzestupnฤ. Poslednรญ iterace byla dokonฤena a proces ลazenรญ je nynรญ dokonฤen.
Pseudokรณd algoritmu ลazenรญ Radix
Zde je pseudokรณd pro Radix Sort Algorithm
radixSortAlgo(arr as an array) Find the largest element in arr maximum=the element in arr that is the largest Find the number of digits in maximum k=the number of digits in maximum Create buckets of size 0-9 k times for j -> 0 to k Acquire the jth place of each element in arr. Here j=0 represents the least significant digit. Use a stable sorting algorithm like counting sort to sort the elements in arr according to the digits of the elements in the jthplace arr = sorted elements
C++ Program pro implementaci Radix Sort
#include <iostream>
using namespace std;
// Function to get the largest element in an array
int getMaximum(int arr[], int n) {
int maximum = arr[0];
for (int i = 1; i < n; i++) {
if (maximum < arr[i]) maximum = arr[i];
}
return maximum;
}
// We are using counting sort to sort the elements digit by digit
void countingSortAlgo(int arr[], int size, int position) {
const int limit = 10;
int result[size];
int count[limit] = {0};
// Calculating the count of each integers
for (int j = 0; j < size; j++) count[(arr[j] / position) % 10]++;
// Calculating the cumulative count
for (int j = 1; j < limit; j++) {
count[j] += count[j - 1];
}
// Sort the integers
for (int j = size - 1; j >= 0; j--) {
result[count[(arr[j] / position) % 10] - 1] = arr[j];
count[(arr[j] / position) % 10]--;
}
for (int i = 0; i < size; i++) arr[i] = result[i];
}
// The radixSort algorithm
void radixSortAlgo(int arr[], int size) {
// Get the largest element in the array
int maximum = getMaximum(arr, size);
for (int position = 1; maximum / position > 0; position *= 10)
countingSortAlgo(arr, size, position);
}
// Printing final result
void printResult(int arr[], int size) {
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
}
int main() {
int arr[] = {162, 623, 835, 415, 248};
int size = sizeof(arr) / sizeof(arr[0]);
radixSortAlgo(arr, size);
printResult(arr, size);
}
Vรฝstup:
162 248 415 623 835
Python Program pro Radix Sort Algorithm
#Radix Sort using python
def countingSortAlgo(arr, position):
n = len(arr)
result = [0] * n
count = [0] * 10 # Calculating the count of elements in the array arr
for j in range(0, n):
element = arr[j] // position
count[element % 10] += 1 # Calculating the cumulative count
for j in range(1, 10):
count[j] += count[j - 1] # Sorting the elements
i = n - 1
while i >= 0:
element = arr[i] // position
result[count[element % 10] - 1] = arr[i]
count[element % 10] -= 1
i -= 1
for j in range(0, n):
arr[j] = result[j]
def radixSortAlgo(arr): # Acquiring the largest element in the array
maximum = max(arr) # Using counting sort to sort digit by digit
position = 1
while maximum // position > 0:
countingSortAlgo(arr, position)
position *= 10
input = [162, 623, 835, 415, 248]
radixSortAlgo(input)
print(input)
Vรฝstup:
[162,248,415,623,835]
Analรฝza sloลพitosti Radix Sort
Je tลeba zvรกลพit dva typy sloลพitosti, prostorovou sloลพitost a ฤasovou sloลพitost.
- Prostorovรก sloลพitost: O(n+b) kde n je velikost pole a b je uvaลพovanรก bรกze.
- ฤasovรก sloลพitost: O(d*(n+b)), kde d je poฤet ฤรญslic nejvฤtลกรญho prvku v poli.
Prostorovรก sloลพitost Radix Sort
Dvฤ funkce, na kterรฉ je tลeba se zamฤลit pro sloลพitost prostoru
- Poฤet prvkลฏ v poli, n.
- Zรกklad pro reprezentaci prvkลฏ, b.
Nฤkdy mลฏลพe bรฝt tato zรกkladna vฤtลกรญ neลพ velikost pole.
Celkovรก sloลพitost je tedy O(n+b).
Nรกsledujรญcรญ vlastnosti prvkลฏ v seznamu mohou zpลฏsobit, ลพe tลรญdicรญ prostor radix bude neefektivnรญ:
- Prvky s velkรฝm poฤtem ฤรญslic.
- Zรกklad prvkลฏ je velkรฝ, jako 64bitovรก ฤรญsla.
ฤasovรก sloลพitost ลazenรญ Radix
Tลรญdฤnรญ poฤรญtรกnรญ mลฏลพete pouลพรญt jako podprogram, protoลพe kaลพdรก iterace bude trvate O(n+b) ฤas. Pokud existujรญ d iterace, celkovรก doba bฤhu se stane O(d*(n+b)). Zde โOโ znamenรก funkci sloลพitosti.
Linearita Radix Sort
Radix Sort je lineรกrnรญ, kdyลพ
- d je konstantnรญ, kde d je poฤet ฤรญslic nejvฤtลกรญho prvku.
- b nenรญ ve velkรฉ mรญลe vฤtลกรญ ve srovnรกnรญ s n.
Srovnรกnรญ Radix Sort s jinรฝmi srovnรกvacรญmi algoritmy
Jak jsme vidฤli, sloลพitost ลazenรญ Radix je zaloลพena na velikosti slova nebo ฤรญsla. Bude to mรญt stejnou sloลพitost pro prลฏmฤrnรฉ a nejlepลกรญ pลรญpady. A to je O(d*(n+b)). Takรฉ se liลกรญ podle techniky tลรญdฤnรญ, kterou uprostลed pouลพรญvรกte. Napลรญklad mลฏลพete pouลพรญt poฤรญtacรญ tลรญdฤnรญ nebo rychlรฉ tลรญdฤnรญ pro mezilehlรฝ tลรญdicรญ algoritmus uvnitล ลazenรญ Radix.
Aplikace Radix Sort Algorithmu
Dลฏleลพitรฉ aplikace Radix Sort jsou:
- Radix Sort lze pouลพรญt jako algoritmus pro vyhledรกvรกnรญ polohy, kde se pouลพรญvajรญ velkรฉ rozsahy hodnot.
- Pouลพรญvรก se pลi konstrukci pole pลรญpon v algoritmu DC3.
- Pouลพรญvรก se v sekvenฤnรญm stroji s nรกhodnรฝm pลรญstupem pลรญtomnรฉm v typickรฉm poฤรญtaฤi, kde jsou zรกznamy klรญฤovรกny.
