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

Fungovรกnรญ Radix Sort Algorithmu
Seznam celรฝch ฤรญsel k seล™azenรญ

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

Fungovรกnรญ Radix Sort Algorithmu
ล˜azenรญ podle poslednรญ ฤรญslice

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.

Fungovรกnรญ Radix Sort Algorithmu
Seznam po prvnรญ iteraci

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

Fungovรกnรญ Radix Sort Algorithmu
ล˜azenรญ na zรกkladฤ› ฤรญslic na mรญstฤ› desรญtek

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

Fungovรกnรญ Radix Sort Algorithmu
Seznam po druhรฉ iteraci

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

Fungovรกnรญ Radix Sort Algorithmu
ล˜azenรญ na zรกkladฤ› ฤรญslic na stovkรกch mรญst

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.

Fungovรกnรญ Radix Sort Algorithmu
Seznam po tล™etรญ iteraci

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.

Shrลˆte tento pล™รญspฤ›vek takto: