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

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

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.

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

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

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

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.
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.
