鸡尾酒排序
是基于冒泡排序的一种升级排序法( 双向冒泡排序)
冒泡排序:每一轮都是从左到右来比较元素,进行 单向的位置交换的。
鸡尾酒排序的元素比较和交换过程是 双向的。
解决的问题如下:从小到大排序{2,3,4,5,6,7,8,1}
如果用冒泡排序
存在的问:只有元素1的位置不对,却还要进行7轮排序
解决方案:鸡尾酒排序
第1轮从左到右,第2轮从右到左,第3轮再从左到右……
在鸡尾酒排序的第3轮,需要重新从左向右比较并进行交换。1和2比较,位置不变;2和3比较,位置不变;3和4比较,位置不变……6和7比较,位置不变。没有元素位置进行交换,证明已经有序,排序结束
注意:代码中外层循环次数是:array.length/2
原因:代码外层的大循环控制着所有排序回合,大循环内包含2个小循环,第1个小循环从左向右比较并交换元素,第2个小循环从右向左比较并交换元素。
所以,一个大循环就把头尾俩个元素都排序好了,外层循环次数就得减半。
package mysort.bubbleSort;
import java.util.Arrays;
public class cocktailSort {
public static void sort(int array[]){
int tmp = 0;
for (int i = 0;i<array.length/2;i++){
//有序标记,每一轮的初始值都是true
boolean isSorted = true;
//************奇数轮,从左向右比较和交换**********
for (int j=i; j<array.length-1-i; j++){
//大元素后移
if(array[j]>array[j+1]){
tmp = array[j];
array[j] = array[j+1];
array[j+1] = tmp;
// 有元素交换,所以不是有序的,标记变为false
isSorted = false;
}
}
if(isSorted){
break;
}
// 在偶数轮之前,将isSorted重新标记为true
isSorted = true;
//****************偶数轮,从右向左比较和交换**************
for (int j=array.length-1-i; j>i;j--){
//大元素后移动
if(array[j]<array[j-1]){
tmp = array[j];
array[j] = array[j-1];
array[j-1] = tmp;
isSorted = false;
}
}
if(isSorted){
break;
}
}
}
public static void main(String[] args) {
int []array = new int[]{2,3,4,5,6,7,8,1};
sort(array);
System.out.println(Arrays.toString(array));
}
}
通过 if(isSorted){ break; }
来提前跳出循环
奇数轮:将最大的元素逐一放到右边
偶数轮:将最小的元素逐一放到左边
优势:鸡尾酒排序的优点是能够在特定条件下,减少排序的回合数;
(就如上例子,排序三轮就行了)
使用场景:至于它能发挥出优势的场景,是大部分元素已经有序的情况。