Menu
Coddy logo textTech

Radix Sort

Última actualización

Radix sort es un ordenamiento sin comparaciones para enteros. En lugar de comparar valores, ordena los números dígito a dígito. La versión de dígito menos significativo (LSD) procesa primero el dígito de las unidades, luego las decenas y después las centenas, usando un counting sort estable en cada dígito. Como cada pasada es estable, una vez procesado el dígito más significativo todo el arreglo queda ordenado. Pulsa reproducir arriba para ver cómo cada pasada de dígitos reordena las barras.

Radix sort se ejecuta en tiempo O(d·(n + k)), donde d es el número de dígitos y k es la base (10 aquí). Para enteros de ancho fijo esto es prácticamente lineal - puede superar a los ordenamientos por comparación O(n log n) - pero solo funciona con datos que puedan descomponerse en dígitos o claves.

Complejidad temporal y espacial

CasoComplejidadNotas
TiempoO(d·(n + k))d dígitos, base k (lineal para d fijo)
EspacioO(n + k)Arreglo de salida + conteos de dígitos
EstableCada pasada de dígito es un counting sort estable
¿Comparación?NoOrdena por dígito, no comparando valores
Funciona conEnteros/clavesNo con objetos comparables generales

Paso a paso

PasoQué ocurre
1Encontrar el valor máximo para saber cuántos dígitos procesar.
2Empezar por el dígito menos significativo (las unidades).
3Ordenar el arreglo de forma estable por ese dígito con counting sort.
4Pasar al siguiente dígito más significativo.
5Repetir hasta procesar todas las posiciones de dígitos.

Ejemplo resuelto

Ordenando [170, 45, 75, 90, 2, 24, 66]:

PasadaArregloAcción
Inicio[170, 45, 75, 90, 2, 24, 66]El máximo es 170, así que se necesitan tres pasadas de dígitos.
Unidades[170, 90, 2, 24, 45, 75, 66]Orden estable por el dígito de las unidades: 0, 0, 2, 4, 5, 5, 6.
Decenas[2, 24, 45, 66, 170, 75, 90]Orden estable por el dígito de las decenas: 0, 2, 4, 6, 7, 7, 9 (170 conserva su ventaja sobre 75).
Centenas[2, 24, 45, 66, 75, 90, 170]Orden estable por el dígito de las centenas; solo 170 tiene un 1, así que va al final. Ordenado.

Cuándo usar radix sort

Úsalo cuandoEvítalo cuando
Las claves son enteros o cadenas de longitud fija que puedes dividir en dígitos.Debes ordenar objetos arbitrarios con un comparador personalizado.
Las claves tienen un número pequeño y acotado de dígitos d, de modo que O(d·(n + k)) supera a O(n log n).Las claves son muy largas o no acotadas, lo que hace d grande y las pasadas costosas.
Necesitas un orden estable y puedes permitirte O(n + k) de espacio extra.La memoria es escasa y los búferes O(n + k) son inaceptables.
El rango de valores o la base k es modesto respecto a n.k es enorme, así que cada pasada de counting sort domina el tiempo de ejecución.

Código de Radix Sort

Una implementación limpia y ejecutable de Radix Sort en Python, JavaScript, Java, C++, C. Elige un lenguaje, copia el código o ábrelo ya cargado en el Playground de Coddy.

Código de Radix Sort en 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))
Ejecuta este código en el Playground de Python

Preguntas frecuentes sobre Radix Sort

¿Cuál es la complejidad temporal de radix sort?
Radix sort es O(d·(n + k)), donde d es el número de dígitos y k la base. Para enteros de ancho fijo esto es prácticamente O(n), lo que puede ser más rápido que los ordenamientos por comparación. Usa O(n + k) de espacio extra.
¿Es estable radix sort?
Sí. El radix sort LSD se apoya en un counting sort estable en cada dígito; la estabilidad es lo que hace que el enfoque dígito a dígito produzca un resultado correctamente ordenado.
¿Cuándo puedo usar radix sort?
Radix sort funciona con datos que pueden descomponerse en dígitos o claves de tamaño fijo, como enteros o cadenas de longitud fija. No es un ordenamiento por comparación de propósito general, por lo que no puede ordenar objetos arbitrarios con un comparador personalizado.
¿En qué se diferencia radix sort de counting sort?
Counting sort ordena por una sola clave en una pasada y necesita un arreglo de conteo tan grande como el rango de valores, por lo que se degrada cuando los valores están muy dispersos. Radix sort aplica counting sort dígito a dígito, manteniendo pequeño el arreglo de conteo de cada pasada (base k), lo que le permite manejar rangos de valores grandes que el counting sort simple no podría.
¿Por qué el radix sort LSD empieza por el dígito menos significativo?
Empezar por el dígito menos significativo permite que cada pasada estable conserve el orden establecido por todos los dígitos anteriores menos significativos. Cuando se procesa el dígito más significativo, los empates en ese dígito ya están correctamente ordenados por los dígitos inferiores, así que el arreglo queda totalmente ordenado. Ordenar primero por el dígito más significativo rompería esto y requeriría un enfoque recursivo distinto (radix sort MSD).
¿Puede radix sort manejar números negativos?
No directamente: la extracción básica de dígitos supone enteros no negativos. Soluciones comunes son desplazar todos los valores sumando el mínimo para que todo sea no negativo, u ordenar por separado los negativos y los no negativos y luego concatenarlos. Ignorar esto es un error frecuente al aplicar radix sort a datos reales.
Coddy programming languages illustration

Domina los algoritmos con Coddy

COMENZAR