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));
        }

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

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

  • 相关阅读:
    洛谷P1196银河英雄传说
    NOIP2011普及组第三题瑞士轮(洛谷P1309)
    Dijkstra算法
    10.13做题——洛谷1449后缀表达式
    NOI题库(1.12.T3)甲流病人初筛
    10.12做题——NOI题库(1.13.T30)1的个数
    NOIP考试必备——随机数
    10.10做题——USACO1.2/洛谷1207回文平方数(Dual Palindromes)
    10.9做题——洛谷P1927防护伞
    10.9做题——USACO1.2/洛谷1206回文平方数(Palindromic Squares)
  • 原文地址:https://www.cnblogs.com/du001011/p/10436697.html
Copyright © 2011-2022 走看看