Ordenamiento Radix

Harshit Jindal 12 octubre 2023
  1. Algoritmo de Ordenamiento Radix
  2. Ejemplo de Ordenamiento Radix
  3. Implementación del Algoritmo de Ordenamiento Radix
  4. Complejidad del algoritmo de Ordenamiento Radix
Ordenamiento Radix
Nota
Si no sabes lo que es la ordenación por conteo, entonces por favor revisa el artículo ordenamiento por cuentas primero.

Ordenamiento Radix es un algoritmo de ordenación no comparativo. Este algoritmo evita las comparaciones insertando elementos en cubos de acuerdo con el radix (Radix/Base es el número de dígitos únicos utilizados para representar números. Por ejemplo, los números decimales tienen diez dígitos únicos). Ordena los elementos basándose en los dígitos de los elementos individuales. Realiza la ordenación por conteo de los dígitos desde el menos significativo hasta el más significativo. También se ha llamado ordenación en cubo o digital y es muy útil en máquinas paralelas.

Algoritmo de Ordenamiento Radix

Supongamos que tenemos un array A[] sin ordenar que contiene n elementos.

  • Encuentre el elemento más grande maxm en el array.
  • Ordena cada dígito de maxm empezando por el menos significativo utilizando un algoritmo de ordenación estable.

Ejemplo de Ordenamiento Radix

Supongamos que tenemos el array (1851, 913, 1214, 312, 111, 23, 41, 9). Vamos a ordenarlo utilizando el algoritmo de ordenación radix.

Índice Matriz de entrada Primera iteración Segunda iteración Tercera iteración Cuarta iteración
0 1851 1851 0009 0009 0009
1 0913 0111 0111 0023 0023
2 1214 0041 0312 0041 0041
3 0312 0312 0913 0111 0111
4 0111 0913 1214 1214 0312
5 0023 0023 0023 0312 0913
6 0041 1214 0041 1851 1214
7 0009 0009 1851 0913 1851

En la primera iteración, ordenamos según el lugar de la unidad y luego nos movemos hacia los lugares de las decenas, centenas y millares para obtener el array ordenada final como 9, 23, 41, 111, 312, 913, 1214, 1851.

Implementación del Algoritmo de Ordenamiento Radix

#include <iostream>
using namespace std;
const int N = 10;

int maxm(int arr[], int n) {
  int max = arr[0];
  for (int i = 1; i < n; i++) {
    if (arr[i] > max) {
      max = arr[i];
    }
  }
  return max;
}

void countingSort(int arr[], int n, int place) {
  int output[n];
  int count[N];

  for (int i = 0; i < N; ++i) count[i] = 0;

  for (int i = 0; i < n; i++) count[(arr[i] / place) % 10]++;

  for (int i = 1; i < N; i++) count[i] += count[i - 1];

  for (int i = n - 1; i >= 0; i--) {
    output[count[(arr[i] / place) % 10] - 1] = arr[i];
    count[(arr[i] / place) % 10]--;
  }

  for (int i = 0; i < n; i++) arr[i] = output[i];
}

void radixsort(int arr[], int n) {
  int max = maxm(arr, n);
  for (int place = 1; max / place > 0; place *= 10) countingSort(arr, n, place);
}

int main() {
  int n = 5;
  int arr[5] = {1851, 913, 1214, 312, 111};
  cout << "Input arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
  radixsort(arr, n);  // Sort elements in ascending order
  cout << "Output arr: ";
  for (int i = 0; i < n; i++) {
    cout << arr[i] << " ";
  }
  cout << "\n";
}

Complejidad del algoritmo de Ordenamiento Radix

Complejidad temporal

  • Caso medio

La ordenación radix tiene una complejidad temporal de O(n + b) donde b es el rango de entrada. Si hay d dígitos en el elemento máximo maxm, la complejidad temporal de Radix Sort es O(d*(n + b)). Como d y b suelen ser pequeños, la complejidad temporal es del orden de [Big Theta]: O(n).

  • El peor caso

La complejidad temporal en el peor de los casos es del orden de [Big O]: O(n).

  • El mejor caso

La complejidad temporal en el mejor de los casos es [Big Omega]: O(n). Es la misma que la complejidad temporal del peor caso.

Complejidad espacial

La complejidad espacial del algoritmo de Ordenamiento Radix es O(n+b), donde b es el rango de entrada. Proviene de los Arrays count &output en la ordenación radix. A veces b puede ser mayor que n, lo que hace que la complejidad no sea lineal.

Harshit Jindal avatar Harshit Jindal avatar

Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.

LinkedIn

Artículo relacionado - Sort Algorithm