RadixSort

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.

Código del algoritmo RadixSort

        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;
        }

Implementación

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