Algoritmo di ordinamento radicale nella struttura dei dati
โก Riepilogo intelligente
Radix Sort รจ un algoritmo di ordinamento lineare non comparativo che raggruppa gli interi in base alla posizione delle cifre, utilizzando una subroutine stabile come il counting sort. Ordina numeri, stringhe e chiavi a larghezza fissa piรน velocemente degli algoritmi di ordinamento basati sul confronto per molti tipi di input.

Cos'รจ l'algoritmo Radix Sort?
Radix Sort รจ un algoritmo di ordinamento non comparativo. Funziona raggruppandoping le singole cifre degli elementi da ordinare. Viene quindi utilizzata una tecnica di ordinamento stabile per organizzare gli elementi in base alla loro base. Si tratta di un algoritmo di ordinamento lineare.
Il processo di ordinamento coinvolge le seguenti proprietร :
- Si individua l'elemento massimo e si calcola il numero di cifre di tale elemento. Questo fornisce il numero di iterazioni eseguite dal processo di ordinamento.
- Grouping le singole cifre degli elementi nella stessa posizione significativa in ogni iterazione.
- Il gruppoping Il processo inizia dalla cifra meno significativa e termina con la cifra piรน significativa.
- Ordinamento degli elementi in base alle cifre in quella posizione significativa.
- Mantiene l'ordine relativo degli elementi che hanno lo stesso valore di chiave. Questa proprietร dell'ordinamento Radix lo rende un algoritmo di ordinamento stabile.
L'iterazione finale restituisce un elenco completamente ordinato.
Funzionamento dell'algoritmo Radix Sort
Elenco di numeri interi da ordinare
Ordiniamo l'elenco di numeri interi nella figura precedente in ordine crescente utilizzando l'algoritmo Radix Sort.
Ecco i passaggi per eseguire il processo di ordinamento Radix:
Passo 1) Individua l'elemento massimo nella lista. In questo caso รจ 835.
Passo 2) Conta le sue cifre. 835 ha 3 cifre, quindi il numero di iterazioni รจ 3.
Passo 3) Determina la base. Poichรฉ si tratta di un numero decimale, la base รจ 10.
Passo 4) Avvia la prima iterazione.
a) Prima iterazione
Ordinamento in base all'ultima cifra
Nella prima iterazione, consideriamo il valore posizionale unitario di ciascun elemento.
Passo 1) Si applica il modulo 10 al numero intero per ottenere la cifra delle unitร . Ad esempio, 623 mod 10 dร 3 e 248 mod 10 dร 8.
Passo 2) Utilizza l'ordinamento per conteggio o un altro algoritmo di ordinamento stabile per organizzare i numeri interi in base alla loro cifra meno significativa. Come si puรฒ vedere nella figura, 248 rientra nell'ottavo gruppo, 623 nel terzo gruppo e cosรฌ via.
Dopo la prima iterazione, l'elenco ora appare cosรฌ.
Elenco dopo la prima iterazione
L'elenco non รจ ancora ordinato e richiede ulteriori iterazioni.
b) Seconda iterazione
Ordinamento in base alle cifre delle decine
In questa iterazione, consideriamo la cifra delle decine per il processo di ordinamento.
Passo 1) Dividi i numeri interi per 10. Ad esempio, 248 diviso 10 dร 24.
Passo 2) Applica il modulo 10 al risultato del passaggio 1. 24 mod 10 dร 4.
Passo 3) Ripeti il โโpassaggio 2 dell'iterazione precedente.
Dopo la seconda iterazione, l'elenco ora si presenta cosรฌ:
Elenco dopo la seconda iterazione
L'elenco non รจ ancora completamente ordinato, in quanto non รจ ancora in ordine crescente.
c) Terza iterazione
Ordinamento in base alle cifre delle centinaia
Per l'ultima iterazione, vogliamo ottenere la cifra piรน significativa. In questo caso, si tratta della cifra delle centinaia per ciascuno degli interi presenti nell'elenco.
Passo 1) Dividi i numeri interi per 100. Ad esempio, 415 diviso 100 dร 4.
Passo 2) Applica il modulo 10 al risultato del passaggio 1. 4 mod 10 dร 4.
Passo 3) Ripeti il โโpassaggio 3 dell'iterazione precedente.
Elenco dopo la terza iterazione
L'elenco รจ ora ordinato in ordine crescente. L'ultima iterazione รจ stata completata e il processo di ordinamento รจ terminato.
Pseudocodice dell'algoritmo Radix Sort
Ecco lo pseudocodice dell'algoritmo di ordinamento 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 in the jth place 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 integer 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 in 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 data = [162, 623, 835, 415, 248] radixSortAlgo(data) print(data)
Produzione:
[162, 248, 415, 623, 835]
Analisi della complessitร dell'ordinamento Radix
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ร spaziale:
- Numero di elementi nell'array, n.
- La base utilizzata 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 presenti nell'elenco possono rendere l'algoritmo Radix Sort inefficiente in termini di spazio:
- Elementi con un gran numero di cifre.
- La base degli elementi รจ grande, come i numeri a 64 bit.
Complessitร temporale dell'ordinamento digitale
Utilizzando l'ordinamento per conteggio come sottoprogramma, ogni iterazione richiede O(n + b) tempo. Se esistono d iterazioni, il tempo di esecuzione totale diventa O(d * (n + b))Qui, โOโ denota la funzione di complessitร .
Linearitร dell'ordinamento radicale
L'ordinamento Radix รจ lineare quando:
- d รจ costante, dove d รจ il numero di cifre dell'elemento piรน grande.
- b non รจ significativamente piรน grande di n.
Confronto tra l'ordinamento Radix e altri algoritmi di ordinamento Algorithms
La complessitร dell'algoritmo Radix Sort dipende dalla dimensione del numero. I casi migliori e average-case hanno entrambi una complessitร O(d * (n + b)). Le prestazioni variano a seconda dell'algoritmo di ordinamento interno: il counting sort รจ lo standard, ma qualsiasi algoritmo di ordinamento stabile funziona.
Applicazioni dell'algoritmo Radix Sort
Le principali applicazioni dell'algoritmo Radix Sort sono:
- L'ordinamento Radix puรฒ essere utilizzato come algoritmo di localizzazione quando sono coinvolti ampi intervalli di valori.
- Viene utilizzato per costruire un array di suffissi nell'algoritmo DC3.
- Viene utilizzato nelle macchine ad accesso casuale sequenziale, dove i record sono indicizzati da identificatori a larghezza fissa.







