Este algoritmo funciona trasladando los elementos a una cola, comenzando con el dígito menos significativo del número (El número colocado más a la derecha tomando en cuenta unidades, decenas,centenas, etc.). Cuando todos los elementos son ingresados a las colas, éstas se recorren en orden para después agregarlos al vector.
Este algoritmo es muy rápido en comparación con otros algoritmos de ordenación, sin embargo ocupa más espacio de memoria al utilizar colas.
Ejemplo de ordenamiento.
Asignamos los elementos en colas, tomando en dígito menos significativo de cada elementos del vector.
Se ordenan y después de la primera iteración el vector queda:
Con la segunda iteración el dígito menos significativo será el que esta en posición de las decenas.
Y así termina ordenado nuestro vector.
public static int[] ordenacionRadix(int vec[]){
int rep=1; //cantidad de repeticiones
int numBytes=4; //número de bytes a desplazar
int numColas=(int) Math.pow(2, numBytes);
//Creación de las colas
Queue[] cola=new LinkedList[numColas];
for(int i=0;i<numColas;i++){
cola[i]=new LinkedList();
}
int div=0;
for (int i = 0; i < rep; i++) {
//En esta parte recorre el vector para guardar cada valor en la cola
for(int numero:vec){
//busca el mayor número del vector
if(i==0) if(numero>rep) rep=numero;
//Calcula en que cola debe de ir cada numero
int numCola=(numero>>div)&0xf;
cola[numCola].add(numero);
}
div=div+numBytes;
//recorre cada cola para colocar cada elemento en el vector
int j=0;
for(Queuec:cola){
while(!c.isEmpty())
vec[j++]=c.remove();
}
//la primera vez se actualiza el número de veces que debe ejecutar el proceso
if(i==0){
rep=(int) (Math.log(rep)/Math.log(numColas))+1;
}
}
return vec;
}
public class RadixSort {
public static void main(String args[]){
int vec[]={45,17,23,67,21, 44, 12,34};
System.out.println("Vector original");
imprimirVector(vec);
System.out.println("\nVector ordenado");
vec=ordenacionRadix(vec);
imprimirVector(vec);
}
public static int[] ordenacionRadix(int vec[]){
int rep=1; //cantidad de repeticiones
int numBytes=4; //número de bytes a desplazar
int numColas=(int) Math.pow(2, numBytes);
//Creación de las colas
Queue[] cola=new LinkedList[numColas];
for(int i=0;i<numColas;i++){
cola[i]=new LinkedList();
}
int div=0;
for (int i = 0; i < rep; i++) {
//En esta parte recorre el vector para guardar cada valor en la cola
for(int numero:vec){
//busca el mayor número del vector
if(i==0) if(numero>rep) rep=numero;
//Calcula en que cola debe de ir cada numero
int numCola=(numero>>div)&0xf;
cola[numCola].add(numero);
}
div=div+numBytes;
//recorre cada cola para colocar cada elemento en el vector
int j=0;
for(Queuec:cola){
while(!c.isEmpty())
vec[j++]=c.remove();
}
//la primera vez se actualiza el número de veces que debe ejecutar el proceso
if(i==0){
rep=(int) (Math.log(rep)/Math.log(numColas))+1;
}
}
return vec;
}
public static void imprimirVector(int vec[]){
for(int i=0;i<vec.length;i++){
System.out.print(vec[i]+" ");
}
}
}