Algorytm sortowania radiacyjnego w strukturze danych

Co to jest algorytm sortowania radiacyjnego?

Sortowanie radiksowe to algorytm sortowania nieporรณwnawczego. Dziaล‚a poprzez grupowanieping Poszczegรณlne cyfry elementรณw, ktรณre majฤ… zostaฤ‡ posortowane. Nastฤ™pnie stosuje siฤ™ stabilnฤ… technikฤ™ sortowania, aby uporzฤ…dkowaฤ‡ elementy na podstawie ich podstawy. Jest to liniowy algorytm sortowania.

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.
  • Grouping Proces 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.

Podsumuj ten post nastฤ™pujฤ…co: