Ordenación Shaker

Este tipo de ordenación es otra mejora más al método de la Burbuja, el proceso que lleva es inicia desde la primera posición del arreglo hasta la última y después en sentido inverso, de la última posición a la primera.


En este caso el vector queda ordenado en la primera iteración, aún así el proceso se repite 1 vez más por la condición del ciclo, gracias a este algoritmo el número de comparaciones se reducen muy notablemente de una iteración a otra.

Código del algoritmo

       public static int[] ordenacionShaker(int vec[]){
                int limiteInferior=0;
                int limiteSuperior=vec.length-1;
                while(limiteInferior<=limiteSuperior){
                        for(int j=limiteInferior;j<limiteSuperior;j++){
                                if(vec[j]>vec[j+1]){
                                        int temp=vec[j];
                                        vec[j]=vec[j+1];
                                        vec[j+1]=temp;
                                }
                        }
                        limiteSuperior--;
                        for(int j=limiteSuperior;j>limiteInferior;j--){
                                if(vec[j]<vec[j-1]){
                                        int temp=vec[j];
                                        vec[j]=vec[j-1];
                                        vec[j-1]=temp;
                                }
                        }
                        limiteInferior++;
                }
                
                return vec;
        }

Implementación

public class Shacker {
        
        public static void main(String args[]){
                int vec[]={45,17,23,67,21};
                System.out.println("Vector original");
                imprimirVector(vec);
                System.out.println("\n");
                vec=ordenacionShaker(vec);
                imprimirVector(vec);
        }
        
        public static int[] ordenacionShaker(int vec[]){
                int limiteInferior=0;
                int limiteSuperior=vec.length-1;
                while(limiteInferior<=limiteSuperior){
                        for(int j=limiteInferior;j<limiteSuperior;j++){
                                if(vec[j]>vec[j+1]){
                                        int temp=vec[j];
                                        vec[j]=vec[j+1];
                                        vec[j+1]=temp;
                                }
                        }
                        limiteSuperior--;
                        for(int j=limiteSuperior;j>limiteInferior;j--){
                                if(vec[j]<vec[j-1]){
                                        int temp=vec[j];
                                        vec[j]=vec[j-1];
                                        vec[j-1]=temp;
                                }
                        }
                        limiteInferior++;
                }
                
                return vec;
        }
        
        public static void imprimirVector(int vec[]){
                for(int i=0;i<vec.length;i++){
                        System.out.print(vec[i]+" ");
                }
        }
        
}