鸡尾酒排序是基于冒泡排序的一种升级排序法,冒泡排序是从左到右来比较元素,进行单向的位置交换的,鸡尾酒排序的元素和交换是双向的,一轮从左到右比较,一轮从右到左比较。
代码外层的大循环控制着所有排序回合,大循环内包含2个小循环,第1个小循环从左向右比较并交换元素,第2个小循环从右向左比较并交换元素。
鸡尾酒排序的优点是能够在特定条件下,减少排序的回合数,缺点就是代码量几乎增加了一倍,它能发挥优势的场景是大部分元素已经有序的情况。
public static void sort(int[] array){
int temp = 0;
for(int i = 0; i < array.length / 2; i++){
//有序标记,每一轮的初始值都是true
boolean isSorted = true;
//奇数轮,从左到右比较和交换
for(int j = 0; j < array.length - i - 1; j++){
if(array[j] > array[j+1]){
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
//有元素交换,所以不是有序的,标记为false
isSorted = false;
}
}
if(isSorted){
break;
}
//偶数轮开始之前,将isSorted重新标记为true
isSorted = true;
//偶数轮,从右到左比较和交换
for(int j = array.length - i - 1; j > i; j--){
if(array[j] < array[j-1]){
temp = array[j];
array[j] = array[j-1];
array[j-1] = temp;
//有元素交换,所以不是有序的,标记为false
isSorted = false;
}
}
if(isSorted){
break;
}
}
}
public static void main(String[] args) {
int[] array = {3,4,10,2,9,1,5,6,7,8};
sort(array);
System.out.println(Arrays.toString(array));
}