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