数据结构---鸡尾酒排序

鸡尾酒排序


是基于冒泡排序的一种升级排序法( 双向冒泡排序
冒泡排序:每一轮都是从左到右来比较元素,进行 单向的位置交换的。
鸡尾酒排序的元素比较和交换过程是 双向的。

解决的问题如下:从小到大排序{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; }
来提前跳出循环

奇数轮:将最大的元素逐一放到右边
偶数轮:将最小的元素逐一放到左边

优势:鸡尾酒排序的优点是能够在特定条件下,减少排序的回合数;
(就如上例子,排序三轮就行了)

使用场景:至于它能发挥出优势的场景,是大部分元素已经有序的情况

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值