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