排序(二)之鸡尾酒排序

鸡尾酒排序改自冒泡排序,比冒泡排序性能好些,主要解决问题是某个小元素在右侧,可以快速移至左侧,而不用靠冒泡排序的大循环,每次移动一个位置。比如这个顺序: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));
    }

 

实时内容请关注微信公众号,公众号与博客同时更新:程序员星星

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值