Algorytm sortowania radiacyjnego w strukturze danych

Co to jest algorytm sortowania radiacyjnego?

Sortowanie Radix to algorytm sortowania nieporównawczego. Działa poprzez grupowanie poszczególnych cyfr elementów przeznaczonych do sortowania. Następnie stosuje się stabilną technikę sortowania w celu uporządkowania elementów na podstawie ich podstawy. Jest to algorytm sortowania liniowego.

Proces sortowania obejmuje następujące właściwości:

  • Znalezienie elementu maksymalnego i uzyskanie liczby cyfr tego elementu. Daje nam to liczbę iteracji, po których nastąpi proces sortowania.
  • Grupuj poszczególne cyfry elementów na tej samej znaczącej pozycji w każdej iteracji.
  • Proces grupowania rozpocznie się od cyfry najmniej znaczącej i zakończy na cyfrze najbardziej znaczącej.
  • Sortowanie elementów na podstawie cyfr w tej znaczącej pozycji.
  • Utrzymywanie względnej kolejności elementów mających tę samą wartość klucza. Ta właściwość sortowania radix sprawia, że ​​jest to sortowanie stabilne.

Ostatnia iteracja da nam całkowicie posortowaną listę.

Działanie algorytmu sortowania Radix

Działanie algorytmu sortowania Radix
Lista liczb całkowitych do posortowania

Spróbujmy posortować listę liczb całkowitych na powyższym rysunku w kolejności rosnącej, korzystając z algorytmu Radix Sort.

Oto kroki, aby przeprowadzić proces sortowania Radix:

Krok 1) Zidentyfikuj element o maksymalnej wartości na liście. W tym przypadku jest to 835.

Krok 2) Oblicz liczbę cyfr elementu maksymalnego. Liczba 835 ma dokładnie 3 cyfry.

Krok 3) Określ liczbę iteracji na podstawie kroku 2. 835 ma 3 cyfry, co oznacza, że ​​liczba iteracji wyniesie 3.

Krok 4) Określ podstawę elementów. Ponieważ jest to system dziesiętny, podstawą będzie 10.

Krok 5) Rozpocznij pierwszą iterację.

a) Pierwsza iteracja

Działanie algorytmu sortowania Radix
Sortowanie według ostatniej cyfry

W pierwszej iteracji rozważamy jednostkową wartość miejsca każdego elementu.

Krok 1) Zmodyfikuj liczbę całkowitą o 10, aby uzyskać miejsce jednostkowe elementów. Na przykład 623 mod 10 daje nam wartość 3, a 248 mod 10 daje nam 8.

Krok 2) Użyj sortowania zliczającego lub innego stabilnego sortowania, aby uporządkować liczby całkowite według ich najmniej znaczącej cyfry. Jak widać z rysunku, 248 spadnie na ósme wiadro. 8 spadnie na trzecie wiadro i tak dalej.

Po pierwszej iteracji lista wygląda teraz tak.

Działanie algorytmu sortowania Radix
Lista po pierwszej iteracji

Jak widać na powyższym rysunku, lista nie jest jeszcze posortowana i wymaga dalszych iteracji, aby została w pełni posortowana.

b) Druga iteracja

Działanie algorytmu sortowania Radix
Sortowanie na podstawie cyfr na miejscu dziesiątek

W tej iteracji rozważymy cyfrę 10th miejsce procesu sortowania.

Krok 1) Podziel liczby całkowite przez 10. 248 podzielone przez 10 daje nam 24.

Krok 2) Zmodyfikuj wyjście kroku 1 na 10. 24 mod 10 daje nam 4.

Krok 3) Wykonaj krok 2 z poprzedniej iteracji.

Po drugiej iteracji lista wygląda teraz tak

Działanie algorytmu sortowania Radix
Lista po drugiej iteracji

Z powyższego rysunku widać, że lista nadal nie jest całkowicie posortowana, ponieważ nie jest jeszcze ułożona w porządku rosnącym.

c) Trzecia iteracja

Działanie algorytmu sortowania Radix
Sortowanie na podstawie cyfr w setkach miejsc

W ostatniej iteracji chcemy uzyskać najbardziej znaczącą cyfrę. W tym przypadku jest to 100th miejsce dla każdej liczby całkowitej na liście.

Krok 1) Podziel liczby całkowite przez 100… 415 podzielone przez 100 daje nam 4.

Krok 2) Zmodyfikuj wynik z kroku 1 na 10. 4 mod 10 daje nam ponownie 4.

Krok 3) Wykonaj krok 3 z poprzedniej iteracji.

Działanie algorytmu sortowania Radix
Lista po trzeciej iteracji

Jak widzimy, lista jest teraz posortowana rosnąco. Ostatnia iteracja została zakończona i proces sortowania został zakończony.

Pseudokod algorytmu sortowania radiacyjnego

Oto pseudokod algorytmu sortowania Radix

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 do implementacji sortowania radiacyjnego

#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);
}

Wyjście:

162 248 415 623 835

Python Program do algorytmu sortowania Radix

#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)

Wyjście:

[162,248,415,623,835]

Analiza złożoności sortowania radiksowego

Należy wziąć pod uwagę dwa typy złożoności: złożoność przestrzenną i złożoność czasową.

  • Złożoność przestrzenna: O(n+b), gdzie n jest rozmiarem tablicy, a b jest rozpatrywaną bazą.
  • Złożoność czasowa: O(d*(n+b)), gdzie d jest liczbą cyfr największego elementu w tablicy.

Złożoność przestrzenna sortowania radiksowego

Dwie funkcje, na których należy się skupić w kontekście złożoności przestrzeni

  • Liczba elementów w tablicy, n.
  • Baza do reprezentacji elementów, b.

Czasami ta podstawa może być większa niż rozmiar tablicy.

Całkowita złożoność wynosi zatem O(n+b).

Następujące właściwości elementów listy mogą sprawić, że sortowanie radiksowe będzie nieefektywne:

  • Elementy z dużą liczbą cyfr.
  • Podstawa elementów jest duża, jak liczby 64-bitowe.

Złożoność czasowa sortowania radiksowego

Możesz użyć sortowania przez zliczanie jako podprogramu, ponieważ będzie trwała każda iteracjami O(n+b) czas. Jeśli istnieją różnice, całkowity czas działania wynosi O(d*(n+b)). Tutaj „O” oznacza funkcję złożoności.

Liniowość sortowania radiacyjnego

Sortowanie radiacyjne jest liniowe, gdy

  • d jest stała, gdzie d jest liczbą cyfr największego elementu.
  • b nie jest w dużym stopniu większy w porównaniu do n.

Porównanie sortowania radiksowego z innymi algorytmami porównawczymi

Jak widzieliśmy, złożoność sortowania Radix opiera się na rozmiarze słowa lub liczby. Będzie miała taką samą złożoność dla przeciętnego i najlepszego przypadku. I to jest O(d*(n+b)). Ponadto różni się w zależności od techniki sortowania, której używasz w środku. Na przykład możesz użyć sortowania zliczającego lub szybkiego sortowania dla pośredniego algorytmu sortowania wewnątrz sortowania Radix.

Zastosowania algorytmu sortowania Radix

Ważne zastosowania sortowania radiacyjnego to:

  • Sortowanie Radix może być używane jako algorytm wyszukiwania lokalizacji, gdy używane są duże zakresy wartości.
  • Służy do konstruowania tablicy sufiksów w algorytmie DC3.
  • Używa się go w sekwencyjnych maszynach o swobodnym dostępie, obecnych w typowym komputerze, w których rekordy są wprowadzane za pomocą kluczy.