zoukankan      html  css  js  c++  java
  • 数据结构与算法系列——排序(8.2)_鸡尾酒排序

    1. 工作原理(定义)

      核心思想:鸡尾酒排序是冒泡排序的一种改进和变型 ,又称“双向冒泡排序”,鸡尾酒排序是从低到高然后从高到低来回排序(选出最大和最小项),比冒泡排序的效率稍微好一点,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目。 

    2. 算法步骤

    1. 先对数组从左到右进行冒泡排序(升序),则最大的元素去到最右端 
    2. 再对数组从右到左进行冒泡排序(降序),则最小的元素去到最左端 
    3. 循环1、2步操作,依次改变冒泡的方向,并不断缩小未排序元素的范围,直到最后一个元素结束

      

    4. 性能分析

      鸡尾酒排序是冒泡排序的一种改进,倒并未有本质的改变,与冒泡排序的时间复杂度和空间复杂度相近,整体的性能都比较差。

    1. 时间复杂度

      (1)顺序排列时,鸡尾酒排序时间复杂度为O(n); 
      (2)逆序排序时,鸡尾酒排序时间复杂度为O(n^2); 
      (3)当原始序列杂乱无序时,平均时间复杂度为O(n^2)。

    2. 空间复杂度

      鸡尾酒排序排序过程中,Swap函数需要一个临时变量temp进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)。

    3. 算法稳定性 

      鸡尾酒排序是一种稳定的排序算法。

    5. 具体代码

    public class CockTailSort{
        public static void main(String[] args) {
            int[] arr = {8,7,6,5,4,3,2,1};
            cockTailSort(arr);
        }
    
        public static void cockTailSort(int[] arr) {
            boolean isSorted=false;
            int length = arr.length;
            //双向同时进行
            for(int i=0;i<length/2;i++) {
                isSorted=false;
                //升序排列
                for(int j=i;j<length-i-1;j++) {
                    if(arr[j]>arr[j+1]) {
                        swap(arr, j, j + 1);
                        isSorted=true;
                    }
                }
                //降序排列
                for(int j=length-i-1;j>i;j--) {
                    if(arr[j] < arr[j-1]) {
                         swap(arr, j, j - 1);
                        isSorted=true;
                    }
                }
    
                if(isSorted==false) {
                    break;
                }
            }
        }
        //交换
        private static void swap(int[] arr, int a, int b) {
            int tmp = arr[a];
            arr[a] = arr[b];
            arr[b] = tmp;
        }
    }

    6. 参考网址

    1. 排序算法系列之鸡尾酒排序

  • 相关阅读:
    实时视频应用示例:监控与音乐教学
    im ui框架调研,对比
    WampServer 常见问题
    Android Studio xcode单步调试 WebRTC Android & iOS
    WebRTC 源码分析(五):安卓 P2P 连接过程和 DataChannel 使用
    归并排序的分析与Java实现
    Redis的数据类型
    使用Maven进行多模块拆分
    内容平台消息队列异步静态化实现
    ActiveMQ的应用实例
  • 原文地址:https://www.cnblogs.com/haimishasha/p/10883796.html
Copyright © 2011-2022 走看看