Saltar al contenido principal

Radix Sort

Radix Sort es un algoritmo de ordenamiento no basado en comparación que ordena enteros procesando dígito por dígito (de menor a mayor posición, o viceversa), normalmente usando Counting Sort como subrutina estable.

Principio Rector: Ordena los números por posición de dígito, comenzando desde la posición menos significativa (LSD – Least Significant Digit) o desde la más significativa (MSD – Most Significant Digit).

Complejidades

  • En el mejor caso, la complejidad temporal es de O(nk)O(n k), y la complejidad espacial es de O(n+k)O(n + k)
  • En el caso promedio, la complejidad temporal es de O(nk)O(n k), y la complejidad espacial es de O(n+k)O(n + k)
  • En el peor caso, la complejidad temporal es de O(nk)O(n k), y la complejidad espacial es de O(n+k)O(n + k)

Donde:

  • n: es el número de elementos
  • k: es el número de dígitos del número más grande, suele ser constante, y tiene un rendimiento cercano a O(n)O(n)

Características

  • Es estable, pero, solo si el sort interno lo es.
  • No es in-place
  • Solo sirve para valores discretos (enteros, fechas, string fijos)
  • Ideal cuando los datos tienen longitud limitada de representación.

Diagrama de secuencia

  1. El usuario pide ordenar los datos usando Radix Sort.
  2. El algoritmo busca cual es el valor máximo dentro del arreglo, para saber cuántas posiciones decimales se deben procesar (unidades, decenas, centenas, etc.).
  3. Se inicia un ciclo que recorre cada posición decimal (exp=1, 10, 100, etc.). El ciclo se repite hasta que el resultado de la división entre el número máximo sobre el valor de posición decimal sea mayor que 0. Luego se itera por cada posición decimal.
  4. Se ordena el arreglo según el dígito actual (exp), usando la función countingSortByDigit.
  5. Dentro del método de ordenamiento por dígito, se inicializa un arreglo contador en ceros.
  6. Se cuenta cuantas veces aparece cada dígito en la posición actual.
  7. Se acumulan los conteos para determinas las posiciones finales en el arreglo ordenado.
  8. Se llena un arreglo de salida con los elementos ordenados según el dígito actual.
  9. Se copia los valores del output de vuelta en el arreglo original para continuar con la siguiente iteración.
  10. Se desactiva el proceso de ordenamiento por dígito.
  11. Se retorna el arreglo parcialmente ordenado a Radix Sort para continuar con el siguiente dígito.
  12. Se devuelve el arreglo ordenado al usuario.

Ejemplo técnico

import java.util.Arrays;

public class RadixSort {

public static void sort(int[] array) {
int maxValue = Arrays.stream(array).max().getAsInt();

for (int digitPlace = 1; maxValue / digitPlace > 0; digitPlace *= 10) {
sortByDigit(array, digitPlace);
}
}

private static void sortByDigit(int[] array, int digitPlace) {
int[] sortedArray = new int[array.length];
int[] digitCount = new int[10];

for (int number : array) {
int digit = (number / digitPlace) % 10;
digitCount[digit]++;
}

for (int i = 1; i < 10; i++) {
digitCount[i] += digitCount[i - 1];
}

for (int i = array.length - 1; i >= 0; i--) {
int digit = (array[i] / digitPlace) % 10;
int position = digitCount[digit] - 1;
sortedArray[position] = array[i];
digitCount[digit]--;
}

System.arraycopy(sortedArray, 0, array, 0, array.length);
}
}

Aplicaciones Reales

  1. Procesamiento de grandes volúmenes de datos enteros en bancos y censos.
  2. Ordenamiento de códigos postales, identificadores o fechas.
  3. Datos tabulares que requieren alta velocidad y estabilidad.
  4. Aplicaciones en FPGA (matriz de puertas programables en campo), ASIC (circuito integrado para aplicaciones específicas), donde se requiere rendimiento determinista sin comparaciones.

Referencias

  • Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2022). Introduction to Algorithms (4th ed.). MIT Press.
  • Knuth, D. E. (1998). The Art of Computer Programming, Vol. 3: Sorting and Searching. Addison-Wesley.
  • Sedgewick, R., & Wayne, K. (2011). Algorithms (4th ed.). Addison-Wesley.
  • Weiss, M. A. (2020). Data Structures and Algorithm Analysis in Java (4th ed.). Pearson.