Menu
Coddy logo textTech

Radix sort

Ultimo aggiornamento

Il radix sort è un ordinamento non basato sui confronti per numeri interi. Invece di confrontare i valori, ordina i numeri cifra per cifra. La versione LSD (dalla cifra meno significativa) elabora prima le unità, poi le decine, poi le centinaia, usando un counting sort stabile per ogni cifra. Dato che ogni passata è stabile, una volta elaborata la cifra più significativa l'intero array è ordinato. Premi play qui sopra per vedere ogni passata sulle cifre riordinare le barre.

Il radix sort richiede tempo O(d·(n + k)), dove d è il numero di cifre e k la base (qui 10). Per interi a larghezza fissa è di fatto lineare e può battere gli ordinamenti per confronto O(n log n), ma funziona solo su dati che si possono scomporre in cifre o chiavi.

Complessità temporale e spaziale

CasoComplessitàNote
TempoO(d·(n + k))d cifre, base k (lineare per d fisso)
SpazioO(n + k)Array di output + conteggi delle cifre
StabileSìOgni passata sulle cifre è un counting sort stabile
Per confronto?NoOrdina per cifra, non confrontando i valori
Funziona suInteri/chiaviNon su oggetti confrontabili generici

Passo dopo passo

PassoCosa succede
1Trova il valore massimo per sapere quante cifre elaborare.
2Parti dalla cifra meno significativa (le unità).
3Ordina l'array in modo stabile in base a quella cifra usando il counting sort.
4Passa alla cifra successiva, più significativa.
5Ripeti finché tutte le posizioni delle cifre non sono elaborate.

Esempio svolto

Ordinamento di [170, 45, 75, 90, 2, 24, 66]:

PassataArrayAzione
Inizio[170, 45, 75, 90, 2, 24, 66]Il massimo è 170, quindi servono tre passate sulle cifre.
Unità[170, 90, 2, 24, 45, 75, 66]Ordinamento stabile per la cifra delle unità: 0, 0, 2, 4, 5, 5, 6.
Decine[2, 24, 45, 66, 170, 75, 90]Ordinamento stabile per la cifra delle decine: 0, 2, 4, 6, 7, 7, 9 (170 resta davanti a 75).
Centinaia[2, 24, 45, 66, 75, 90, 170]Ordinamento stabile per la cifra delle centinaia; solo 170 ha un 1, quindi va in fondo. Ordinato.

Quando usare il radix sort

Usalo quandoEvitalo quando
Le chiavi sono interi o stringhe a lunghezza fissa che puoi scomporre in cifre.Devi ordinare oggetti arbitrari con un comparatore personalizzato.
Le chiavi hanno un numero di cifre d piccolo e limitato, quindi O(d·(n + k)) batte O(n log n).Le chiavi sono molto lunghe o illimitate, rendendo d grande e le passate costose.
Ti serve un ordinamento stabile e puoi permetterti O(n + k) di spazio extra.La memoria è poca e i buffer O(n + k) non sono accettabili.
L'intervallo dei valori o la base k è contenuto rispetto a n.k è enorme, quindi ogni passata di counting sort domina il tempo di esecuzione.

Codice Radix Sort

Un'implementazione di Radix Sort pulita ed eseguibile in Python, JavaScript, Java, C++, C. Scegli un linguaggio, copia il codice o aprilo già caricato nel Playground di Coddy.

Codice Radix Sort in Python

Python
1def radix_sort(a):2    # Sort by each decimal digit, least significant first3    max_value = max(a)4    exp = 15    while max_value // exp > 0:6        a = sort_by_digit(a, exp)7        exp *= 108    return a9
10
11def sort_by_digit(a, exp):12    buckets = [[] for _ in range(10)]13    for value in a:14        digit = (value // exp) % 1015        buckets[digit].append(value)16    # Concatenating buckets 0..9 keeps the sort stable17    return [value for bucket in buckets for value in bucket]18
19
20nums = [170, 45, 75, 90, 802, 24, 2, 66]21print("Before:", nums)22print("After: ", radix_sort(nums))
Esegui questo codice nel playground Python

Domande frequenti sul radix sort

Qual è la complessità temporale del radix sort?
Il radix sort è O(d·(n + k)), dove d è il numero di cifre e k la base. Per interi a larghezza fissa è di fatto O(n), e può essere più veloce degli ordinamenti per confronto. Usa O(n + k) di spazio extra.
Il radix sort è stabile?
Sì. Il radix sort LSD si basa su un counting sort stabile per ogni cifra; è proprio la stabilità a far sì che l'approccio cifra per cifra produca un risultato ordinato correttamente.
Quando posso usare il radix sort?
Il radix sort funziona su dati scomponibili in cifre o chiavi a dimensione fissa, come interi o stringhe a lunghezza fissa. Non è un ordinamento per confronto generico, quindi non può ordinare oggetti arbitrari con un comparatore personalizzato.
In cosa il radix sort è diverso dal counting sort?
Il counting sort ordina in base a una sola chiave in una passata e ha bisogno di un array dei conteggi grande quanto l'intervallo dei valori, quindi peggiora quando i valori sono molto sparsi. Il radix sort applica il counting sort cifra per cifra, mantenendo piccolo l'array dei conteggi di ogni passata (base k), e così gestisce grandi intervalli di valori che un semplice counting sort non potrebbe gestire.
Perché il radix sort LSD parte dalla cifra meno significativa?
Partire dalla cifra meno significativa permette a ogni passata stabile di preservare l'ordine stabilito da tutte le cifre precedenti, meno significative. Quando si arriva alla cifra più significativa, i pareggi su quella cifra sono già ordinati correttamente dalle cifre inferiori, quindi l'array risulta completamente ordinato. Partire dalla cifra più significativa romperebbe questo meccanismo e richiederebbe un approccio diverso e ricorsivo (radix sort MSD).
Il radix sort gestisce i numeri negativi?
Non direttamente: l'estrazione base delle cifre presuppone interi non negativi. Le soluzioni comuni sono spostare tutti i valori sommando il minimo in modo che siano tutti non negativi, oppure ordinare separatamente negativi e non negativi e poi concatenarli. Ignorare questo aspetto è un bug frequente quando si applica il radix sort a dati reali.
Illustrazione dei linguaggi di programmazione di Coddy

Padroneggia gli algoritmi con Coddy

INIZIA