Algoritmo di ordinamento radicale nella struttura dei dati
Cos'รจ l'algoritmo Radix Sort?
Radix Sort รจ un algoritmo di ordinamento non comparativo. Funziona raggruppando le singole cifre degli elementi da ordinare. Viene quindi utilizzata una tecnica di ordinamento stabile per organizzare gli elementi in base alla loro radice. ร un algoritmo di ordinamento lineare.
Il processo di ordinamento coinvolge le seguenti proprietร :
- Trovare l'elemento massimo e acquisire il numero di cifre di quell'elemento. Ci dร il numero di iterazioni che seguirร il processo di ordinamento.
- Raggruppare le singole cifre degli elementi nella stessa posizione significativa in ciascuna iterazione.
- Il processo di raggruppamento inizierร dalla cifra meno significativa e terminerร con la cifra piรน significativa.
- Ordinamento degli elementi in base alle cifre in quella posizione significativa.
- Mantenimento dell'ordine relativo degli elementi che hanno lo stesso valore chiave. Questa proprietร del radix sort lo rende un ordinamento stabile.
L'iterazione finale ci fornirร un elenco completamente ordinato.
Funzionamento dell'algoritmo Radix Sort

Proviamo a ordinare l'elenco di numeri interi nella figura sopra in ordine crescente utilizzando l'algoritmo Radix Sort.
Ecco i passaggi per eseguire il processo di ordinamento radicale:
Passo 1) Identificare l'elemento con il valore massimo nell'elenco. In questo caso รจ 835.
Passo 2) Calcolare il numero di cifre dell'elemento massimo. 835 ha esattamente 3 cifre.
Passo 3) Determinare il numero di iterazioni in base al passaggio 2. 835 ha 3 cifre, il che significa che il numero di iterazioni sarร 3.
Passo 4) Determinare la base degli elementi. Poichรฉ si tratta di un sistema decimale, la base sarร 10.
Passo 5) Avvia la prima iterazione.
a) Prima iterazione

Nella prima iterazione, consideriamo il valore posizionale unitario di ciascun elemento.
Passo 1) Modifica il numero intero per 10 per ottenere il posto unitario degli elementi. Ad esempio, 623 mod 10 ci dร il valore 3 e 248 mod 10 ci dร 8.
Passo 2) Utilizzare l'ordinamento di conteggio o qualsiasi altro ordinamento stabile per organizzare gli interi in base alla cifra meno significativa. Come si vede dalla figura, 248 cadranno nell'ottavo secchio. 8 cadranno sul 623ยฐ secchio e cosรฌ via.
Dopo la prima iterazione, l'elenco ora appare cosรฌ.

Come puoi vedere dalla figura sopra, l'elenco non รจ ancora ordinato e richiede piรน iterazioni per essere completamente ordinato.
b) Seconda iterazione

In questa iterazione, considereremo la cifra 10th posto per il processo di smistamento.
Passo 1) Dividi i numeri interi per 10. 248 diviso per 10 dร 24.
Passo 2) Modifica l'output del passaggio 1 per 10. 24 mod 10 ci dร 4.
Passo 3) Seguire il passaggio 2 dell'iterazione precedente.
Dopo la seconda iterazione, l'elenco ora appare cosรฌ

Puoi vedere dalla figura sopra che l'elenco non รจ ancora completamente ordinato poichรฉ non รจ ancora in ordine crescente.
c) Terza iterazione

Per l'iterazione finale, vogliamo ottenere la cifra piรน significativa. In questo caso sono i 100th posto per ciascuno dei numeri interi nell'elenco.
Passo 1) Dividi i numeri interi per 100... 415 diviso per 100 dร 4.
Passo 2) Modifica il risultato del passaggio 1 con 10. 4 mod 10 ci dร di nuovo 4.
Passo 3) Seguire il passaggio 3 dell'iterazione precedente.
Come possiamo vedere, l'elenco รจ ora ordinato in ordine crescente. L'iterazione finale รจ stata completata e il processo di ordinamento รจ terminato.
Pseudocodice dell'algoritmo Radix Sort
Ecco lo pseudo-codice per l'algoritmo Radix Sort
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++ Programma per implementare l'ordinamento digitale
#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);
}
Produzione:
162 248 415 623 835
Python Programma per l'algoritmo di ordinamento radicale
#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)
Produzione:
[162,248,415,623,835]
Analisi della complessitร di Radix Sort
Esistono due tipi di complessitร da considerare: la complessitร spaziale e la complessitร temporale.
- Complessitร spaziale: O(n+b) dove n รจ la dimensione dell'array e b รจ la base considerata.
- Complessitร temporale: O(d*(n+b)) dove d รจ il numero di cifre dell'elemento piรน grande nell'array.
Complessitร spaziale dell'ordinamento radicale
Due caratteristiche su cui concentrarsi per la complessitร dello spazio
- Numero di elementi nell'array, n.
- La base per rappresentare gli elementi, b.
A volte questa base puรฒ essere maggiore della dimensione dell'array.
La complessitร complessiva รจ quindi O(n+b).
Le seguenti proprietร degli elementi nell'elenco possono rendere inefficiente lo spazio di ordinamento digitale:
- Elementi con un gran numero di cifre.
- La base degli elementi รจ grande, come i numeri a 64 bit.
Complessitร temporale dell'ordinamento digitale
ร possibile utilizzare l'ordinamento del conteggio come una subroutine, poichรฉ richiederร ogni iterazioneeO(n+b) tempo. Se esistono d iterazioni, il tempo di esecuzione totale diventa O(d*(n+b)). Qui, "O" indica la funzione di complessitร .
Linearitร dell'ordinamento radicale
Radix Sort รจ lineare quando
- d รจ costante, dove d รจ il numero di cifre dell'elemento piรน grande.
- b non รจ piรน grande in larga misura rispetto a n.
Confronti di Radix Sort con altri algoritmi comparativi
Come abbiamo visto, la complessitร del Radix sort si basa sulla dimensione di una parola o di un numero. Avrร la stessa complessitร per i casi medi e migliori. E questo รจ O(d*(n+b)). Inoltre, differisce in base alla tecnica di ordinamento che usi nel mezzo. Ad esempio, puoi usare counting sort o quick sort per l'algoritmo di ordinamento intermedio all'interno del Radix sort.
Applicazioni dell'algoritmo Radix Sort
Importanti applicazioni di Radix Sort sono:
- Radix Sort puรฒ essere utilizzato come algoritmo di ricerca della posizione in cui vengono utilizzati ampi intervalli di valori.
- Viene utilizzato nella costruzione di un array di suffissi nell'algoritmo DC3.
- Viene utilizzato in una macchina sequenziale ad accesso casuale presente in un tipico computer in cui vengono codificati i record.
