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

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

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

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

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

让我们来举一个栗子:

有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. Docker学习之网络篇
  2. 小学教师计算机国培培训总结,小学教师国培个人研修总结
  3. 【机器学习基础】数学推导+纯Python实现机器学习算法26:随机森林
  4. TX-LCN分布式事务框架开发文档
  5. uva1152 - 4 Values whose Sum is 0(hash或STL技巧ac)
  6. gradle排除依赖_如何从Gradle中的所有依赖项中排除库
  7. 詹金斯的Maven报告
  8. 一个猜拳游戏的算法设计
  9. 【大开眼界】Python爬虫骚操作
  10. matlab练习程序(共生矩阵)
  11. 自学python顺序-Django 学习顺序及入门要求?
  12. python网站上搜索答案_用python搭建百万赢家自动搜索答案
  13. 产品读书《把时间当朋友》
  14. Esp8266 进阶之路33【大神篇】如何优雅地像乐鑫原厂封装esp8266底层寄存器的逻辑思维,做成自己的静态库库文件,让第三方人使用?
  15. Linux使用adsl计时制分享(转)
  16. spark 客户端工具_邮件客户端—spark
  17. MapReduce之InputFormat、OutputFormat(三)
  18. python爬虫之爬取网易云音乐的歌曲图片和歌词
  19. 故障诊断 | 系统级追踪诊断方法及案例分享
  20. 电脑CPU名称修改装逼工具

热门文章

  1. 参考ggplot2,Seaborn将迎来超大版本更新!
  2. dts、dtb的那些事儿
  3. QA问答系统总体介绍
  4. I-000 智能家居系列--需求梳理
  5. mediasoup 学习笔记 【二】Router 房间
  6. QT如何实现后台运行(即最小化到右下角托盘)
  7. chrome查看实际域名_域名实际要多少钱? (专家回答)
  8. j1_09_02。冒泡排序法。实现冒泡游戏功能关键算法。要求:综合使用分支、循环结构语句实现,直接输出结果不计分。
  9. HTC 和 SAMSUNG
  10. 如何正确认识优越感和自卑感