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]+" "); } } }