算法__鸡尾酒排序

鸡尾酒排序:鸡尾酒排序是冒泡排序的升级,冒泡排序在第一轮比较完之后,会从0位继续比较;鸡尾酒排序是在第一轮排序完之后从尾部往前比较。举个例子:

23456781

冒泡排序:

              第一轮:1. 2和3比较,不交换;

                            2. 2和4比较,不交换;

                            3. 4和5比较,不交换;

                            4. 5和6比较,不交换;

                            5. 6和7比较,不交换;

                            6. 7和8比较,不交换;

                            7. 8和1比较,8和1交换

23456718

             第二轮:1. 2和3比较,不交换

                            ...

                           6. 7和1比较,交换

23456178

 除了1,其他位置是有序的。但是冒泡排序得循环几轮比较。

 

鸡尾酒排序:1. 第一轮和冒泡排序

23456718

                     2. 第二轮从右开始比较

                        1. 7和1比较,1和7交换

23456178

                        2. 6和1比较,6和1交换

23451678

                        3. 5和1比较,5和1交换

23415678

                        4. 4和1比较,4和1交换

23145678

                        5. 3和1比较,3和1交换

21345678

                        6. 2和1比较,2和1交换

12345678

                     3. 第三轮从0向右,判断没有需要交换的说明已经排序好了。

鸡尾酒排序优点:对于这种很大一块区域是有序的比冒泡优化了好多。

 

代码如下:

public void CockTailSort(int arry[]) {
        int size = arry.length / 2;
        //是否已经排好序
        boolean isHadSort;
        //左边的排好序的最右端
        int leftPosition = 0;
        int firstPostion = 0;
        //右边的排序的最左端
        int rightPosition = arry.length - 1;
        int lastPostion = arry.length - 1;

        for (int i = 0; i < size; i++) {
            isHadSort = true;
            //从左向右排序
            for (int j = firstPostion; j < lastPostion; j++) {
                if (arry[j] > arry[j + 1]) {
                    arry[j] ^= arry[j + 1];
                    arry[j + 1] ^= arry[j];
                    arry[j] ^= arry[j + 1];

                    rightPosition = j;
                    isHadSort = false;
                }
            }

            if (isHadSort)
                break;
            lastPostion = rightPosition;
            isHadSort = true;

            for (int z = lastPostion; z > firstPostion; z--) {
                if (arry[z] < arry[z - 1]) {
                    arry[z] ^= arry[z - 1];
                    arry[z - 1] ^= arry[z];
                    arry[z] ^= arry[z - 1];

                    leftPosition = z;
                    isHadSort = false;
                }
            }

            if (isHadSort)
                break;
            firstPostion = leftPosition;

        }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值