我们之前了解了冒泡排序的思路

那么,鸡尾酒排序又是何方神圣呢?我们这一期将会详细讲述。

鸡尾酒排序又叫快乐小时排序(不知道为什么起这个名字),它基于冒泡排序做了一点小小优化。

让我们首先来回顾一下冒泡排序的思想:泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。算法的每一轮从都是从左到右比较元素,进行单向的位置交换

那么鸡尾酒排序做了怎样的优化呢?鸡尾酒排序的元素比较和交换过程是双向的。

让我们来举一个栗子:

有8个数组成一个无序数列:2,3,4,5,6,7,8,1,希望从小到大排序。

如果按照冒泡排序的思想,排序的过程是什么样呢?

第一轮结果(8和1交换)

第二轮结果(7和1交换)

第三轮结果(6和1交换)

第四轮结果(5和1交换)

第五轮结果(4和1交换)

第六轮结果(3和1交换)

第七轮结果(2和1交换)

              

鸡尾酒排序是什么样子呢?让我们来看一看详细过程:

第一轮(和冒泡排序一样,8和1交换)

第二轮

此时开始不一样了,我们反过来从右往左比较和交换:

8已经处于有序区,我们忽略掉8,让1和7比较。元素1小于7,所以1和7交换位置:

接下来1和6比较,元素1小于6,所以1和6交换位置:

接下来1和5比较,元素1小于5,所以1和5交换位置:

接下来1和4交换,1和3交换,1和2交换,最终成为了下面的结果:

第三轮(虽然已经有序,但是流程并没有结束)

鸡尾酒排序的第三轮,需要重新从左向右比较和交换:

1和2比较,位置不变;2和3比较,位置不变;3和4比较,位置不变......6和7比较,位置不变。

没有元素位置交换,证明已经有序,排序结束。

这就是鸡尾酒排序的思路。排序过程就像钟摆一样,第一轮从左到右,第二轮从右到左,第三轮再从左到右......

                    

这段代码是鸡尾酒排序的原始实现。代码外层的大循环控制着所有排序回合,大循环内包含两个小循环,第一个循环从左向右比较并交换元素,第二个循环从右向左比较并交换元素。

                 

让我们来回顾一下冒牌排序针对有序区的优化思路:

原始的冒泡排序,有序区的长度和排序的轮数是相等的。比如第一轮排序过后的有序区长度是1,第二轮排序过后的有序区长度是2 ......

要想优化,我们可以在每一轮排序的最后,记录下最后一次元素交换的位置,那个位置也就是无序数列的边界,再往后就是有序区了。对于单向的冒泡排序,我们需要设置一个边界值,对于双向的鸡尾酒排序,我们需要设置两个边界值。请看代码:

代码中使用了左右两个边界值,rightSortBorder 代表右边界,leftSortBorder代表左边界。

在比较和交换元素时,奇数轮从 leftSortBorder 遍历到 rightSortBorder 位置,偶数轮从 rightSortBorder 遍历到 leftSortBorder 位置。

       

                 

                                                                                                                                      转载声明:本文转载自「程序员小灰」

醉了,什么是鸡尾酒排序?相关推荐

  1. python代码实现鸡尾酒排序(双向冒泡排序)

    python代码实现鸡尾酒排序(双向冒泡排序) 鸡尾酒排序是冒泡排序的一种变形.它与冒泡排序的不同之处在于排序时是以双向在序列中进行排序. 鸡尾酒排序的原理跟冒泡排序差不多,只不过冒泡排序每一轮的比较 ...

  2. java 鸡尾酒排序_冒泡排序及优化(Java实现)

    向大端冒泡 public class BubbleSort { public static > void sort(T[] arr) { for (int i = 0, len = arr.le ...

  3. java-数组排序--冒泡排序、鸡尾酒排序、地精排序

    冒泡排序 冒泡排序的思想是,让依次数组中相邻的数进行比较,如果前一个数比后一个数大,则两数进行交换,大的数就会象泡泡一样慢慢浮在水面上了 见图解 稳定性:稳定 时间复杂度:O(n2) 1 public ...

  4. 冒泡排序和鸡尾酒排序(改进的冒泡排序)

    冒泡排序 冒泡排序是最基本的排序算法,也是排序算法中的经典的算法,也是比较简单.容易理解的算法,而且还可以对其排序过程进行优化. 冒泡排序排序过程总是大数往前放,小数往后放,相当于气泡往上升,所以称作 ...

  5. java冒泡排序_Java冒泡排序,鸡尾酒排序

    人生最大的悲哀就是轻信了别人,否认了自己. 冒泡排序 冒泡排序就是不断对比当前数组下标的值和下一个下标得值,当前下标的值如果大于下一个下标的值,两个值互换. int 鸡尾酒排序 冒泡排序的进阶版,在一 ...

  6. C语言鸡尾酒排序cocktail sort算法(附完整源码)

    鸡尾酒排序cocktail sort算法 鸡尾酒排序cocktail sort算法的完整源码(定义,实现,main函数测试) 鸡尾酒排序cocktail sort算法的完整源码(定义,实现,main函 ...

  7. 鸡尾酒排序算法c语言,[golang] 数据结构-鸡尾酒排序

    吐个槽 又是一个不正经取名的排序算法.真要说和鸡尾酒间的关系,大概就是想喝到鸡尾酒(得到排序好的队列)就要摇晃酒杯让不同的成分混合均匀(向两个方向冒泡排序) 原理 鸡尾酒排序(Cocktail Sor ...

  8. 数据结构与算法专题——第九题 鸡尾酒排序

    这篇我们来聊一下鸡尾酒排序,为了知道为啥取名为鸡尾酒,特意看了下百科,见框框的话,也只能勉强这么说了. 要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫"双向冒泡排序",我想 ...

  9. 漫画:什么是鸡尾酒排序

    转载自   漫画:什么是鸡尾酒排序 那么,鸡尾酒排序又是何方神圣呢?我们这一期将会详细讲述. 让我们首先来回顾一下冒泡排序的思想: 冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数 ...

最新文章

  1. php根据循环条件切换图片,thinkphp 循环显示图片问题!!!~~~~
  2. 《python3网络爬虫开发实战》--基本库的使用
  3. Android studio ocr初级app开发问题汇总(含工程代码)
  4. php 7.1/7.3使用 json_encode 函数造成浮点类型数据出现精度问题
  5. jieba.cut与jieba.lcut的区别
  6. 信息学奥赛一本通(1094:与7无关的数)
  7. c语言注释和代码互换,c语言项目—注释转换(c——c++)
  8. Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4
  9. iphone4 Safari实现滚动条功能
  10. 神经网络- 吴恩达Andrew Ng CNN卷积神经网络 论文等资料汇总
  11. 3dmax电脑配置要求(3dmax需要什么样的笔记本配置?)
  12. 工单管理软件,免费工单管理系统
  13. 批量删除微博(不能翻页)
  14. 神经网络压缩 剪枝 量化 嵌入式计算优化NCNN mobilenet squeezenet shufflenet
  15. 无线安全渗透测试套件WiFi-Pumpkin新版本发布
  16. c语言信息注册功能,c语言实现注册登陆功能(两个模块)
  17. 构造方法 梯形面积
  18. 电影后期制作图形服务器,影视后期制作中存储的选择——MDC服务器篇
  19. Hyperledger Fabric 超级账本 区块链技术 概述 优点
  20. Spring Data JPA-动态查询

热门文章

  1. 量化交易 实战第七课 单因子 IC 分析
  2. html图片苹果无法显示,苹果cms采集的图片不显示解决办法
  3. C语言 杨氏矩阵,二维数组查找数字。
  4. 一键重装Win11系统 Win11系统重装教程
  5. 一台电脑安装多个版本的jdk
  6. Intellij中maven项目使用junit时,遇到的问题
  7. 3.5 Option
  8. 清晰明朗创意无限的透明名片设计
  9. php第一章:4.Apache加载php模块 且分配工作给php
  10. scss混合器实现全局更换主题以及相关背景图