zoukankan      html  css  js  c++  java
  • 鸡尾酒排序

    所谓鸡尾酒的排序就是元素比较和交换过程是双向的,而冒泡排序是单项的,

    下面先举个例子来一步一步介绍其排序思想。

    例如给定数组元素为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));
        }

    那么为什么要引入鸡尾酒排序算法?那是因为在特定的条件下,可以减少排序回合数,这也是鸡尾酒排序算法的一大优点吧

    有优点也有缺点,那么它的缺点是:和前面介绍的冒泡排序算法比较,显而易见,代码多。

  • 相关阅读:
    MYSQL数据库基础
    MSYQL操数据DML
    MYSQL外键约束
    MYSQL多表查询
    MYSQL结果排序、分页查询、聚合函数
    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项”的解决方法
    由于扩展配置问题而无法提供您请求的页面。
    JS中的prototype(转载)
    mvc表单如何绑定bool类型的属性或变量
    使用c#正则验证关键字并找出匹配项
  • 原文地址:https://www.cnblogs.com/du001011/p/10436697.html
Copyright © 2011-2022 走看看