所谓鸡尾酒的排序就是元素比较和交换过程是双向的,而冒泡排序是单项的,
下面先举个例子来一步一步介绍其排序思想。
例如给定数组元素为2,3,4,5,6,7,8,1
我们按照冒泡排序的思想,排序过程如下:
从上面的过程我们可以看出,2-8已经有序,只有1无序,而我们却要比较七次,才能排序成功。这样,我们就可以引出我们的鸡尾酒排序算法,也叫快乐小时排序。
下面我们给出鸡尾酒排序过程:
这就是鸡尾酒排序过程,像摆钟一样,第一轮从左向右,第二轮从右向左,第三轮从左向右...
相比较冒泡排序优化了比较次数,下面是鸡尾酒排序代码:
public static void Sort(int[] arr) {
int tmp = 0;
//记录右侧最后一次交换的位置
int lastRightExchangeIndex = 0;
//记录左侧最后一次交换的位置
int lastLeftExchangeIndex = 0;
//无序数列的左边界
int rightBoard = arr.length - 1;
//无序数列的右边界
int leftBoard = 0;
for(int i = 0;i<arr.length/2;i++) {
//有序标记
boolean b = true;
//奇数轮从左向右
for(int j = leftBoard;j<rightBoard;j++) {
if(arr[j]>arr[j+1]) {
tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
b = false;
lastRightExchangeIndex = j;
}
}
rightBoard = lastRightExchangeIndex;
//偶数轮前重新标记true
if(b) break;
//偶数轮从右向左
b = true;
for(int j = rightBoard;j>leftBoard;j--) {
if(arr[j]<arr[j-1]) {
tmp = arr[j];
arr[j] = arr[j-1];
arr[j-1] = tmp;
b = false;
lastLeftExchangeIndex = j;
}
}
leftBoard = lastLeftExchangeIndex;
if(b) break;
}
System.out.println(Arrays.toString(arr));
}
那么为什么要引入鸡尾酒排序算法?那是因为在特定的条件下,可以减少排序回合数,这也是鸡尾酒排序算法的一大优点吧
有优点也有缺点,那么它的缺点是:和前面介绍的冒泡排序算法比较,显而易见,代码多。