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.