鸡尾酒排序改自冒泡排序,比冒泡排序性能好些,主要解决问题是某个小元素在右侧,可以快速移至左侧,而不用靠冒泡排序的大循环,每次移动一个位置。比如这个顺序:2,3,4,5,6,7,8,9,1。
鸡尾酒排序的思想是:第一次从左侧循环到右侧,然后再从右侧循环到左侧,这是一个大循环。然后再从左侧循环到右侧,右侧循环到左侧。下面代码中做了优化,用了一个标志变量isSorted,如果在某次循环中没有元素位置变化,证明已经是有序的,直接break。
public void testCocktailSort() {
int[] array={2,3,4,5,6,7,8,9,1};
for(int i =0; i< array.length/2;i++){
boolean isSorted = true; //标记是否已经有序
//从左到右的循环
for(int j = i; j<array.length-i-1;j++){
if (array[j] > array[j+1]) {
int tem = array[j];
array[j]=array[j+1];
array[j+1] = tem;
isSorted=false;
}
}
if(isSorted){
break;
}
//从右到左的循环
isSorted=true;
for(int j = array.length-i-1;j>i;j--){
if(array[j]<array[j-1]){
int tem = array[j];
array[j]=array[j-1];
array[j-1] = tem;
isSorted=false;
}
}
if(isSorted){
break;
}
}
System.out.println(Arrays.toString(array));
}
和冒泡排序一样,还可以继续优化,用标识符标识出无序区与有序区界限位置,用一个变量记录最后一个变换的位置,有序区内的元素不再参与比较
public void testCocktailSort2() {
int[] array={2,3,4,5,6,7,8,9,1};
int lastRightExchangeIndex=0;
int lastLeftExchangeIndex=0;
int rightUnsortBorder = array.length-1;
int leftUnsortBorder = 0;
for(int i =0; i< array.length/2;i++){
boolean isSorted = true; //标记是否已经有序
//从左到右的循环
for(int j = i; j<rightUnsortBorder;j++){
if (array[j] > array[j+1]) {
int tem = array[j];
array[j]=array[j+1];
array[j+1] = tem;
isSorted=false;
lastRightExchangeIndex =j;
}
}
rightUnsortBorder = lastRightExchangeIndex;
if(isSorted){
break;
}
//从右到左的循环
isSorted=true;
for(int j = array.length-i-1;j>leftUnsortBorder;j--){
if(array[j]<array[j-1]){
int tem = array[j];
array[j]=array[j-1];
array[j-1] = tem;
isSorted=false;
lastLeftExchangeIndex = j;
}
}
leftUnsortBorder = lastLeftExchangeIndex;
if(isSorted){
break;
}
}
System.out.println(Arrays.toString(array));
}
实时内容请关注微信公众号,公众号与博客同时更新:程序员星星