Diferencia entre revisiones de «Ordenamiento Radix»

Línea 1: Línea 1:
{{Mejorar}} 
+
{{Definición
 +
|nombre=Ordenamiento Radix
 +
|imagen=Ordenamiento_radix.jpg
 +
|concepto=El '''ordenamiento Radix''' es un [[algoritmo de ordenamiento]] que ordena enteros procesando sus dígitos de forma individual
 +
}}
  
'''Ordenamiento Radix'''. [[Radix]] (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, radix sort no está limitado sólo a los enteros.  
+
En [[informática]], el '''ordenamiento Radix''' ('''radix sort''' en inglés) es un [[algoritmo de ordenamiento]] que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, ''radix sort'' no está limitado sólo a los enteros.
  
== Descripción ==
+
== Descripción ==
  
La mayor parte de los [[Ordenadores|ordenadores]] digitales representan internamente todos sus datos como representaciones electrónicas de números binarios, por lo que procesar los dígitos de las representaciones de enteros por representaciones de grupos de dígitos binarios es lo más conveniente. Existen dos clasificaciones de radix sort: el de dígito menos significativo ('''LSD''') y el de dígito más significativo ('''MSD'''). ''[[Radix sort LSD]]'' procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo. ''Radix sort MSD'' trabaja en sentido contrario.  
+
La mayor parte de los ordenadores digitales representan internamente todos sus datos como representaciones electrónicas de números binarios, por lo que procesar los dígitos de las representaciones de enteros por representaciones de grupos de dígitos binarios es lo más conveniente. Existen dos clasificaciones de radix sort: el de dígito menos significativo ('''LSD''') y el de dígito más significativo ('''MSD'''). ''Radix sort LSD'' procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo. ''Radix sort MSD'' trabaja en sentido contrario.
  
Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llama a menudo "claves", que pueden existir por sí mismas o asociadas a otros datos. ''Radix sort LSD'' usa típicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y claves de la misma longitud son ordenadas de forma léxica. Esto coincide con el orden normal de las representaciones de enteros, como la secuencia "1, 2, 3, 4, 5, 6, 7, 8, 9, 10". ''[[Radix sorts MSD]]'' usa orden léxico, que es ideal para la ordenación de cadenas de caracteres, como las palabras o representaciones de enteros de longitud fija. Una secuencia como "b, c, d, e, f, g, h, i, j, ba" será ordenada léxicamente como "b, ba, c, d, e, f, g, h, i, j". Si se usa orden léxico para ordenar representaciones de enteros de longitud variable, entonces la ordenación de las representaciones de los números del 1 al 10 será "1, 10, 2, 3, 4, 5, 6, 7, 8, 9", como si las claves más cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para hacerlas tan largas como la clave más larga, para el propósito de este ordenamiento.  
+
Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llama a menudo "claves", que pueden existir por sí mismas o asociadas a otros datos. ''Radix sort LSD'' usa típicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y claves de la misma longitud son ordenadas de forma léxica. Esto coincide con el orden normal de las representaciones de enteros, como la secuencia "1, 2, 3, 4, 5, 6, 7, 8, 9, 10". ''Radix sorts MSD'' usa orden léxico, que es ideal para la ordenación de cadenas de caracteres, como las palabras o representaciones de enteros de longitud fija. Una secuencia como "b, c, d, e, f, g, h, i, j, ba" será ordenada léxicamente como "b, ba, c, d, e, f, g, h, i, j". Si se usa orden léxico para ordenar representaciones de enteros de longitud variable, entonces la ordenación de las representaciones de los números del 1 al 10 será "1, 10, 2, 3, 4, 5, 6, 7, 8, 9", como si las claves más cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para hacerlas tan largas como la clave más larga, para el propósito de este ordenamiento.
  
== Ejemplo ==
+
== Ejemplo ==
  
Vector original:  
+
Vector original:
  
<code>25 57 48 37 12 92 86 33</code>  
+
<code>25 57 48 37 12 92 86 33</code>
  
Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos.  
+
Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos.
  
:0:<br>  
+
:0:<br/>
:1:<br>  
+
:1:<br/>
:2:1<u>2</u> 9<u>2</u>&lt;/br&gt;
+
:2:1<u>2</u> 9<u>2</u></br>
:3:3<u>3</u><br>  
+
:3:3<u>3</u><br/>
:4:<br>  
+
:4:<br/>
:5:2<u>5</u><br>  
+
:5:2<u>5</u><br/>
:6:8<u>6</u><br>  
+
:6:8<u>6</u><br/>
:7:5<u>7</u> 3<u>7</u><br>  
+
:7:5<u>7</u> 3<u>7</u><br/>
:8:4<u>8</u><br>  
+
:8:4<u>8</u><br/>
:9:<br>
+
:9:<br/>
  
Después de la primera pasada, la ordenación queda:  
+
Después de la primera pasada, la ordenación queda:
  
<code>12 92 33 25 86 57 37 48</code>  
+
<code>12 92 33 25 86 57 37 48</code>
  
Colas basadas en el dígito más significativo.  
+
Colas basadas en el dígito más significativo.
  
:0:<br>  
+
:0:<br/>
:1:<u>1</u>2<br>  
+
:1:<u>1</u>2<br/>
:2:<u>2</u>5&lt;/br&gt;
+
:2:<u>2</u>5</br>
:3:<u>3</u>3 <u>3</u>7<br>  
+
:3:<u>3</u>3 <u>3</u>7<br/>
:4:<u>4</u>8<br>  
+
:4:<u>4</u>8<br/>
:5:<u>5</u>7<br>  
+
:5:<u>5</u>7<br/>
:6:<br>  
+
:6:<br/>
:7:<br>  
+
:7:<br/>
:8:<u>8</u>6<br>  
+
:8:<u>8</u>6<br/>
:9:<u>9</u>2<br>
+
:9:<u>9</u>2<br/>
  
Lista ordenada:  
+
Lista ordenada:
  
<code>12 25 33 37 48 57 86 92</code>  
+
<code>12 25 33 37 48 57 86 92</code>
  
== Implementaciones ==
+
== Implementaciones ==
  
El algoritmo Radix Sort en [[C]]<br>  
+
El algoritmo Radix Sort en [[C]]
<pre>void radixsort(int x[], int n)
+
<source lang="C">
 +
#include <math.h>
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#define NUMELTS 20
 +
 
 +
void radixsort(int x[], int n)
 
{
 
{
int front[10], rear[10];
+
  int front[10], rear[10];
struct {
+
  struct {
int info;
+
    int info;
int next;
+
    int next;
} node[NUMELTS];
+
  } node[NUMELTS];
int exp, first, i, j, k, p, q, y;
+
  int exp, first, i, j, k, p, q, y;
  
/* Inicializar una lista vinculada */
+
  /* Inicializar una lista vinculada */
for (i = 0; i &lt; n–1; i++) {
+
  for (i = 0; i < n-1; i++) {
node[i].info = x[i];
+
    node[i].info = x[i];
node[i].next = i+1;
+
    node[i].next = i+1;
} /* fin del for */
+
  } /* fin del for */
node[n–1].info = x[n–1];
+
  node[n-1].info = x[n-1];
node[n–1].next = –1;
+
  node[n-1].next = -1;
first = 0; /* first es la cabeza de la lista vinculada */
+
  first = 0; /* first es la cabeza de la lista vinculada */
for (k = 1; k &lt; 5; k++) {
+
  for (k = 1; k < 5; k++) {
/* Suponer que tenemos números de cuatro dígitos */
+
    /* Suponer que tenemos números de cuatro dígitos */
for (i = 0; i &lt; 10; i++) {
+
    for (i = 0; i < 10; i++) {
/*Inicializar colas */
+
      /*Inicializar colas */
rear[i] = –1;
+
      rear[i] = -1;
front[i] = –1;
+
      front[i] = -1;
} /*fin del for */
+
    } /*fin del for */
/* Procesar cada elemento en la lista */
+
    /* Procesar cada elemento en la lista */
while (first&nbsp;!= –1) {
+
    while (first != -1) {
p = first;
+
      p = first;
first = node[first].next;
+
      first = node[first].next;
y = node[p].info;
+
      y = node[p].info;
/* Extraer el kâsimo dÁgito */
+
      /* Extraer el kâsimo dÁgito */
exp = pow(10, k–1); /* elevar 10 a la (k–1)ésima potencia */
+
      exp = pow(10, k-1); /* elevar 10 a la (k-1)ésima potencia */
j = (y/exp)&nbsp;% 10;
+
      j = (y/exp) % 10;
/* Insertar y en queue[j] */
+
      /* Insertar y en queue[j] */
q = rear[j];
+
      q = rear[j];
if (q == –1)
+
      if (q == -1)
front[j] = p;
+
front[j] = p;
else
+
      else
node[q].next = p;
+
node[q].next = p;
rear[j] = p;
+
      rear[j] = p;
} /*fin del while */
+
    } /*fin del while */
  
/* En este punto, cada registro está en su cola basándose en el dígito k
+
    /* En este punto, cada registro está en su cola basándose en el dígito k
Ahora formar una lista única de todos los elementos de la cola.
+
      Ahora formar una lista única de todos los elementos de la cola.
Encontrar el primer elemento. */
+
      Encontrar el primer elemento. */
for (j = 0; j &lt; 10 &amp;&amp; front[j] == –1; j++);
+
    for (j = 0; j < 10 && front[j] == -1; j++);
;
+
      ;
first = front[j];
+
    first = front[j];
  
/* Vincular las colas restantes */
+
    /* Vincular las colas restantes */
while (j &lt;= 9) { /* Verificar si se ha terminado */
+
    while (j <= 9) { /* Verificar si se ha terminado */
/*Encontrar el elemento siguiente */
+
      /*Encontrar el elemento siguiente */
for (i = j+1; i &lt; 10 &amp;&amp; front[i] == –1; i++);
+
      for (i = j+1; i < 10 && front[i] == -1; i++);
;
+
;
if (i &lt;= 9) {
+
      if (i <= 9) {
p = i;
+
p = i;
node[rear[j]].next = front[i];
+
node[rear[j]].next = front[i];
} /* fin del if */
+
      } /* fin del if */
j = i;
+
      j = i;
} /* fin del while */
+
    } /* fin del while */
node[rear[p]].next = –1;
+
    node[rear[p]].next = -1;
} /* fin del for */
+
  } /* fin del for */
  
/* Copiar de regreso al archivo original */
+
  /* Copiar de regreso al archivo original */
for (i = 0; i &lt; n; i++) {
+
  for (i = 0; i < n; i++) {
x[i] = node[first].info;
+
    x[i] = node[first].info;
first = node[first].next;
+
    first = node[first].next;
} /*fin del for */
+
  } /*fin del for */
 
} /* fin de radixsort*/
 
} /* fin de radixsort*/
 +
  
 
int main(void)
 
int main(void)
 
{
 
{
int x[50] = {NULL}, i;
+
  int x[50] = {NULL}, i;
static int n;
+
  static int n;
 +
 
 +
  printf("\nCadena de números enteros: \n");
 +
  for (n = 0;; n++)
 +
    if (!scanf("%d", &x[n])) break;
 +
  if (n)
 +
    radixsort (x, n);
 +
  for (i = 0; i < n; i++)
 +
    printf("%d ", x[i]);
 +
  return 0;
 +
}</source>
 +
 
 +
El algoritmo Radix Sort en [[Perl]], para claves de igual longitud
 +
<source lang="Perl">
 +
sub radix_sort {
 +
    my $array = shift;          # Recibimos una referencia a un array
 +
    my $from  = $array;
 +
    my $to;
 +
 
 +
    # Esperamos que todas las claves tengan la misma longitud,
 +
    # por lo que hacemos un bucle por todos los dígitos, desde
 +
    # el que está más a la derecha, hacia la izquierda
 +
    for ( my $i = length $array->[ 0 ] - 1; $i >= 0; $i-- ) {
 +
 
 +
        # Una nueva lista de ordenación
 +
        $to = [ ];
 +
 
 +
        # Para todas las claves a ordenar
 +
        foreach my $clave ( @$from ) {
  
printf("\nCadena de números enteros: \n");
+
            # Estabilidad es esencial, por lo que usamos push().
for (n = 0;; n++)
+
            # $to es un array de referencias a arrays de claves ordenadas
if (!scanf("%d", &amp;x[n])) break;
+
            # según el valor numérico (ord()) del dígito de la clave
if (n)
+
            push @{ $to->[ ord( substr $clave, $i ) ] }, $clave;
radixsort (x, n);
+
        }
for (i = 0; i &lt; n; i++)
 
printf("%d ", x[i]);
 
return 0;
 
}</pre>
 
El algoritmo Radix Sort en [[Perl]], para claves de igual longitud&nbsp; &lt;!–– A ESTE EJEMPLO LE FALTA SER FORMATEADO: CADENA DE ENTRADA, COLAS FORMADAS, SALIDA, VARIABLES INTERMEDIAS, ETC. USAR TABLAS Y LISTAS.
 
  
Estado de la lista
+
        # Concatenamos todos los valores ordenados en un solo array.
 +
        # Desplegamos los arrays dentro del array $to
 +
        $from = [ map { @{ $_ || [ ] } } @$to ];
 +
    }
  
i
+
    # Ahora copiamos los elementos al array original, como valor de retorno
 +
    @$array = @$from;
 +
}
 +
</source>
  
 +
<!--
 +
A ESTE EJEMPLO LE FALTA SER FORMATEADO: CADENA DE ENTRADA, COLAS FORMADAS, SALIDA, VARIABLES INTERMEDIAS, ETC.
 +
USAR TABLAS Y LISTAS.
 +
 +
Estado de la lista
 +
 +
i
 
  Node[i].info
 
  Node[i].info
 
  Node[i].next
 
  Node[i].next
  
Inicialización K = 1 K = 2 K = 3  
+
Inicialización K = 1 K = 2 K = 3
 
+
0  
+
0
 
 
 
  65
 
  65
 
  1
 
  1
Línea 154: Línea 200:
 
  2
 
  2
 
   
 
   
 
+
1
1  
 
 
 
 
  789
 
  789
 
  2
 
  2
  –1
+
  -1
  –1
+
  -1
  –1
+
  -1
 
   
 
   
 
+
2
2  
 
 
 
 
  123
 
  123
 
  3
 
  3
Línea 172: Línea 214:
 
  3
 
  3
 
   
 
   
 
+
3
3  
 
 
 
 
  457
 
  457
  –1
+
  -1
 
  1
 
  1
 
  0
 
  0
Línea 182: Línea 222:
 
   
 
   
  
rear = {–1, –1, –1, –1, –1, –1, –1, –1, –1, –1}  
+
rear = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
  
2 0 3 1  
+
2 0 3 1
  
front = {–1, –1, –1, –1, –1, –1, –1, –1, –1, –1}  
+
front = {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
  
2 0 3 1  
+
2 0 3 1
  
<br> k = 1
 
  
p = 0 p = 1 p = 2 p = 3
+
k = 1
  
first = 1 first = 2 first = 3 first = –1
+
p = 0 p = 1 p = 2 p = 3
  
y = 65 y = 789 y = 123 y = 457
+
first = 1 first = 2 first = 3 first = -1
  
exp = 1 exp = 1 exp = 1 exp = 1
+
y = 65 y = 789 y = 123 y = 457
  
j = 5 j = 9 j = 3 j = 7
+
exp = 1 exp = 1 exp = 1 exp = 1
  
q = –1 q = –1 q = –1 q = –1
+
j = 5 j = 9 j = 3 j = 7
  
si q == –1 si q == –1 si q == –1 si q == –1
+
q = -1 q = -1 q = -1 q = -1
  
front[5] = 0 front[9] = 1 front[3] = 2 front[7] = 3
+
si q == -1 si q == -1 si q == -1 si q == -1
  
rear[5] = 0 rear[9] = 1 rear[3] = 2 rear[7] = 3  
+
front[5] = 0 front[9] = 1 front[3] = 2 front[7] = 3
  
j = 3 first = 2 while ( j &lt;= 9) i = 5 si i &lt;= 9
+
rear[5] = 0 rear[9] = 1 rear[3] = 2 rear[7] = 3
  
 +
 +
j = 3
 +
first = 2
 +
while ( j <= 9)
 +
i = 5
 +
si i <= 9
 
                   p = 5
 
                   p = 5
 
                   node[2].next = 0
 
                   node[2].next = 0
 
                   j = 5
 
                   j = 5
 
               i = 7
 
               i = 7
                 si i &lt;= 9
+
                 si i <= 9
 
                   p = 7
 
                   p = 7
 
                   node[0].next = 3
 
                   node[0].next = 3
 
                   j = 5
 
                   j = 5
 
               i = 9
 
               i = 9
                 si i &lt;= 9
+
                 si i <= 9
 
                   p = 9
 
                   p = 9
 
                   node[2].next = 1
 
                   node[2].next = 1
 
                   j = 9
 
                   j = 9
 +
fin del while
 +
p = 9
 +
node[1].next = -1
  
fin del while p = 9 node[1].next = –1
+
===Características===
 
+
Debido a que el ciclo for (k = 1; k <= m; k++) externo se recorre m veces (una para cada dígito) y el ciclo interior n veces (una para cada elemento en el archivo) el ordenamiento es de aproximadamente (m*n).
== Características  ==
+
Si las llaves son complejas (es decir, si casi cada número que puede ser una llave lo es en realidad) m se aproxima a log n, por lo que (m*n) se aproxima a (n log n).
 
+
Si la cantidad de dígitos es grande, en ocasiones es más eficiente ordenar el archivo aplicando primero el ordenamiento de raíz a los dígitos más significativos y después utilizando inserción directa sobre el archivo ordenado.
Debido a que el ciclo for (k = 1; k &lt;= m; k++) externo se recorre m veces (una para cada dígito) y el ciclo interior n veces (una para cada elemento en el archivo) el ordenamiento es de aproximadamente (m*n). Si las llaves son complejas (es decir, si casi cada número que puede ser una llave lo es en realidad) m se aproxima a log n, por lo que (m*n) se aproxima a (n log n). Si la cantidad de dígitos es grande, en ocasiones es más eficiente ordenar el archivo aplicando primero el ordenamiento de raíz a los dígitos más significativos y después utilizando inserción directa sobre el archivo ordenado.  
+
-->
<pre>sub radix_sort {
 
my $array = shift;          # Recibimos una referencia a un array
 
my $from = $array;
 
my $to;
 
 
 
# Esperamos que todas las claves tengan la misma longitud,
 
# por lo que hacemos un bucle por todos los dígitos, desde
 
# el que está más a la derecha, hacia la izquierda
 
for ( my $i = length $array–&gt;[ 0 ] – 1; $i &gt;= 0; $i–– ) {
 
 
 
# Una nueva lista de ordenación
 
$to = [ ];
 
 
 
# Para todas las claves a ordenar
 
foreach my $clave ( @$from ) {
 
  
# Estabilidad es esencial, por lo que usamos push().
+
==Ventajas==
# $to es un array de referencias a arrays de claves ordenadas
 
# según el valor numérico (ord()) del dígito de la clave
 
push @{ $to–&gt;[ ord( substr $clave, $i ) ] }, $clave;
 
}
 
  
# Concatenamos todos los valores ordenados en un solo array.
+
* El ordenamiento es razonablemente eficiente si el número de dígitos en las llaves no es demasiado grande.
# Desplegamos los arrays dentro del array $to
+
* Si las máquinas tienen la ventaja de ordenar los dígitos (sobre todo si están en binario) lo ejecutarían con mucho mayor rapidez de lo que ejecutan una comparación de dos llaves completas.
$from = [ map { @{ $_ || [ ] } } @$to ];
 
}
 
 
 
# Ahora copiamos los elementos al array original, como valor de retorno
 
@$array = @$from;
 
}
 
  
{{Mejorar}}</pre>
+
== Fuentes ==
<br>
+
* [http://search.cpan.org/perldoc?Sort::Radix Sort::Radix] módulo [[Perl]] en [[CPAN]]
 +
* [http://search.cpan.org/perldoc?Sort::Key::Radix Sort::Key::Radix] módulo [[Perl]] en [[CPAN]]
 +
* [http://tutorial-python.com.ar/?p=183  Radix Sort en Python] Radix en Python
 +
* [http://ict.udlap.mx/people/ingrid/Clases/IS211/Radix.html Ordenamiento de raíz (radix sort)]
  
[[Category:Algoritmos]]
+
[[categoría:Ciencias informáticas]]

Revisión del 18:21 24 may 2010

Ordenamiento Radix
Información sobre la plantilla
260px
Concepto:El ordenamiento Radix es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual

En informática, el ordenamiento Radix (radix sort en inglés) es un algoritmo de ordenamiento que ordena enteros procesando sus dígitos de forma individual. Como los enteros pueden representar cadenas de caracteres (por ejemplo, nombres o fechas) y, especialmente, números en punto flotante especialmente formateados, radix sort no está limitado sólo a los enteros.

Descripción

La mayor parte de los ordenadores digitales representan internamente todos sus datos como representaciones electrónicas de números binarios, por lo que procesar los dígitos de las representaciones de enteros por representaciones de grupos de dígitos binarios es lo más conveniente. Existen dos clasificaciones de radix sort: el de dígito menos significativo (LSD) y el de dígito más significativo (MSD). Radix sort LSD procesa las representaciones de enteros empezando por el dígito menos significativo y moviéndose hacia el dígito más significativo. Radix sort MSD trabaja en sentido contrario.

Las representaciones de enteros que son procesadas por los algoritmos de ordenamiento se les llama a menudo "claves", que pueden existir por sí mismas o asociadas a otros datos. Radix sort LSD usa típicamente el siguiente orden: claves cortas aparecen antes que las claves largas, y claves de la misma longitud son ordenadas de forma léxica. Esto coincide con el orden normal de las representaciones de enteros, como la secuencia "1, 2, 3, 4, 5, 6, 7, 8, 9, 10". Radix sorts MSD usa orden léxico, que es ideal para la ordenación de cadenas de caracteres, como las palabras o representaciones de enteros de longitud fija. Una secuencia como "b, c, d, e, f, g, h, i, j, ba" será ordenada léxicamente como "b, ba, c, d, e, f, g, h, i, j". Si se usa orden léxico para ordenar representaciones de enteros de longitud variable, entonces la ordenación de las representaciones de los números del 1 al 10 será "1, 10, 2, 3, 4, 5, 6, 7, 8, 9", como si las claves más cortas estuvieran justificadas a la izquierda y rellenadas a la derecha con espacios en blanco, para hacerlas tan largas como la clave más larga, para el propósito de este ordenamiento.

Ejemplo

Vector original:

25 57 48 37 12 92 86 33

Asignamos los elementos en colas basadas en el dígito menos significativo de cada uno de ellos.

0:
1:
2:12 92
3:33
4:
5:25
6:86
7:57 37
8:48
9:

Después de la primera pasada, la ordenación queda:

12 92 33 25 86 57 37 48

Colas basadas en el dígito más significativo.

0:
1:12
2:25
3:33 37
4:48
5:57
6:
7:
8:86
9:92

Lista ordenada:

12 25 33 37 48 57 86 92

Implementaciones

El algoritmo Radix Sort en C

#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#define NUMELTS 20

void radixsort(int x[], int n)
{
  int front[10], rear[10];
  struct {
    int info;
    int next;
  } node[NUMELTS];
  int exp, first, i, j, k, p, q, y;

  /* Inicializar una lista vinculada */
  for (i = 0; i < n-1; i++) {
    node[i].info = x[i];
    node[i].next = i+1;
  } /* fin del for */
  node[n-1].info = x[n-1];
  node[n-1].next = -1;
  first = 0; /* first es la cabeza de la lista vinculada */
  for (k = 1; k < 5; k++) {
    /* Suponer que tenemos números de cuatro dígitos */
    for (i = 0; i < 10; i++) {
      /*Inicializar colas */
      rear[i] = -1;
      front[i] = -1;
    } /*fin del for */
    /* Procesar cada elemento en la lista */
    while (first != -1) {
      p = first;
      first = node[first].next;
      y = node[p].info;
      /* Extraer el kâsimo dÁgito */
      exp = pow(10, k-1);	/* elevar 10 a la (k-1)ésima potencia */
      j = (y/exp) % 10;
      /* Insertar y en queue[j] */
      q = rear[j];
      if (q == -1)
	front[j] = p;
      else
	node[q].next = p;
      rear[j] = p;
    } /*fin del while */

    /* En este punto, cada registro está en su cola basándose en el dígito k
       Ahora formar una lista única de todos los elementos de la cola.
       Encontrar el primer elemento. */
    for (j = 0; j < 10 && front[j] == -1; j++);
      ;
    first = front[j];

    /* Vincular las colas restantes */
    while (j <= 9) { 	/* Verificar si se ha terminado */
      /*Encontrar el elemento siguiente */
      for (i = j+1; i < 10 && front[i] == -1; i++);
	;
      if (i <= 9) {
	p = i;
	node[rear[j]].next = front[i];
      } /* fin del if */
      j = i;
    } /* fin del while */
    node[rear[p]].next = -1;
  } /* fin del for */

  /* Copiar de regreso al archivo original */
  for (i = 0; i < n; i++) {
    x[i] = node[first].info;
    first = node[first].next;
  } /*fin del for */
} /* fin de radixsort*/


int main(void)
{
  int x[50] = {NULL}, i;
  static int n;

  printf("\nCadena de números enteros: \n");
  for (n = 0;; n++)
    if (!scanf("%d", &x[n])) break;
  if (n)
    radixsort (x, n);
  for (i = 0; i < n; i++)
    printf("%d ", x[i]);
  return 0;
}

El algoritmo Radix Sort en Perl, para claves de igual longitud

sub radix_sort {
    my $array = shift;           # Recibimos una referencia a un array
    my $from  = $array;
    my $to;

    # Esperamos que todas las claves tengan la misma longitud,
    # por lo que hacemos un bucle por todos los dígitos, desde
    # el que está más a la derecha, hacia la izquierda
    for ( my $i = length $array->[ 0 ] - 1; $i >= 0; $i-- ) {

        # Una nueva lista de ordenación
        $to = [ ];

        # Para todas las claves a ordenar
        foreach my $clave ( @$from ) {

            # Estabilidad es esencial, por lo que usamos push().
            # $to es un array de referencias a arrays de claves ordenadas
            # según el valor numérico (ord()) del dígito de la clave
            push @{ $to->[ ord( substr $clave, $i ) ] }, $clave;
        }

        # Concatenamos todos los valores ordenados en un solo array.
        # Desplegamos los arrays dentro del array $to
        $from = [ map { @{ $_ || [ ] } } @$to ];
    }

    # Ahora copiamos los elementos al array original, como valor de retorno
    @$array = @$from;
}


Ventajas

  • El ordenamiento es razonablemente eficiente si el número de dígitos en las llaves no es demasiado grande.
  • Si las máquinas tienen la ventaja de ordenar los dígitos (sobre todo si están en binario) lo ejecutarían con mucho mayor rapidez de lo que ejecutan una comparación de dos llaves completas.

Fuentes