动画:什么是鸡尾酒排序和地精排序?

2019 年 2 月 13 日 算法与数据结构

来自:五分钟学算法(微信号:blgczzz)

从冒泡排序开始

先来看回顾一下冒泡排序的思想和原理。

冒泡排序的思想

冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。

冒泡排序算法的原理

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

  • 针对所有的元素重复以上的步骤,除了最后一个。

  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

一般情况下,可以通过下面的动画理解冒泡排序。

冒泡排序

现在我们来看一组特殊数据如果使用冒泡排序会怎么样。

将无序数列:2,3,4,5,6,7,8,1,使用冒泡排序使其从小到大排序。

无序数列

进行逐步分析:

  1. 第一轮操作( 8 和 1 交换 )

    第一轮操作( 8 和 1 交换 )
  2. 第二轮操作( 7 和 1 交换 )

    第二轮操作( 7 和 1 交换 )
  3. 第三轮操作( 6 和 1 交换 )

    第三轮操作( 6 和 1 交换 )
  4. 第四轮操作( 5 和 1 交换 )

    第四轮操作( 5 和 1 交换 )
  5. 第五轮操作( 4 和 1 交换 )

    第五轮操作( 4 和 1 交换 )
  6. 第六轮操作( 3 和 1 交换 )

    第六轮操作( 3 和 1 交换 )
  7. 第七轮操作( 2 和 1 交换 )

    第七轮操作( 2 和 1 交换 )

仔细观察上面的这组无序数列,实际上只有 1 的位置不在该在的位置,而 2 ,3 ,4 ,5 ,6 ,7 ,8 都已经有序了,结果使用冒泡排序,需要 折腾 7 次 才能将 1 归位。

鸡尾酒排序

鸡尾酒排序

鸡尾酒排序,也就是定向冒泡排序,鸡尾酒搅拌排序,搅拌排序(也可以视作选择排序的一种变形),涟漪排序,来回排序或快乐小时排序,是冒泡排序的一种变形。

此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。

排序过程:

  • 先对数组从左到右进行冒泡排序(升序),则最大的元素去到最右端

  • 再对数组从右到左进行冒泡排序(降序),则最小的元素去到最左端

  • 以此类推,依次改变冒泡的方向,并不断缩小未排序元素的范围,直到最后一个元素结束

Show Me The Animation

  1. 第一轮操作( 8 和 1 交换 )

    第一轮操作( 8 和 1 交换 )
  2. 第二轮操作 ( 从序列右边开始遍历 )

    第二轮操作 ( 从序列右边开始遍历 )
  3. 第三轮操作 ( 从左向右比较和交换 )

    第三轮操作 ( 从左向右比较和交换 )


    在这一轮操作中,没有元素位置交换,证明已经有序,排序结束。

对比 冒泡排序 ,鸡尾酒排序只需要 3 轮操作就可以完成排序。

地精排序

Gnome 排序(地精排序),起初由 Hamid Sarbazi-Azad 于 2000 年提出,并被称为 stupid 排序,后来被 Dick Grune 描述并命名为 “地精排序” 。

地精排序和插入排序类似,除了移动一个元素到最终的位置,是通过交换一系列的元素实现,就像冒泡排序一样。概念上十分简单,不需要嵌套循环。时间复杂度为O(n^2),但是如果初始数列基本有序,时间复杂度将降为O(n)。实际上 Gnome 算法可以和插入排序算法一样快。平均运行时间为O(n^2)。

将无序数列:6,2,4,1,5,使用地精排序使其从小到大排序。

通过设计标识 i = 0 ,然后从头开始判断,什么时候 ( i < 4 ) 不成立,什么时候排序结束。

这里的核心点就是 如何控制 i 的值

第一轮操作「i = 0」

先让 i 自增 1 ,达到值为 1 才开始比较 :

交换前 [ 6 2 4 1 ] 『 i = 0

交换后 [ 6 2 4 1 ] 『 i = 1

第二轮操作「i = 1」

比较 6 和 2 ,发生交换,只要发生交换 i 就减 1

交换前 [ 6 2 4 1 ]『 i = 1 』

交换后 [ 2 6 4 1 ]『 i = 0 』

第三轮操作「i = 0」

i 变成 0 了,啥也不干,自增变成 1 再说。

交换前 [ 2 6 4 1 ]『 i = 0 』

交换后 [ 2 6 4 1 ]『 i = 1 』

第四轮操作「i = 1」

比较 2 和 6 ,不交换,只要不要换就自增 1

交换前 [ 2 6 4 1 ]『 i = 1 』

交换后 [ 2 6 4 1 ]『 i = 2 』

第五轮操作「i = 2」

比较 6 和 4 ,发生交换,只要发生交换 i 就减 1

交换前 [ 2 6 4 1 ]『 i = 2 』

交换后 [ 2 4 6 1 ]『 i = 1 』

第六轮操作「i = 1」

比较 2 和 4 ,不交换,只要不要换就自增 1

交换前 [ 2 6 4 1 ]『 i = 1 』

交换后 [ 2 4 6 1 ]『 i = 2 』

第七轮操作「i = 2」

比较 4 和 6 ,不交换,只要不要换就自增 1

交换前 [ 2 4 6 1 ]『 i = 2 』

交换后 [ 2 4 6 1 ]『 i = 3 』

第八轮操作「i = 3」

比较 6 和 1 ,发生交换,只要发生交换 i 就减 1

交换前 [ 2 4 6 1 ]『 i = 3 』

交换后 [ 2 4 1 6 ]『 i = 2 』

第九轮操作「i = 2」

比较 4 和 1 ,发生交换,只要发生交换 i 就减 1

交换前 [ 2 4 1 6 ]『 i = 2 』

交换后 [ 2 1 4 6 ]『 i = 1 』

第十轮操作「i = 1」

比较 2 和 1 ,发生交换,只要发生交换 i 就减 1

交换前 [ 2 1 4 6 ]『 i = 1 』

交换后 [ 1 2 4 6 ]『 i = 0 』

第十一轮操作「i = 0」

啥也不干,先让 i 自增1,达到值为 1 才开始真正的比较。

『 i = 1 』时,比较 1 和 2 ,不交换,只要不交换就自增 1 。  
『 i = 2 』时,比较 2 和 4 ,不交换,只要不交换就自增 1 。  
『 i = 3 』时,比较 4 和 6 ,不交换,只要不交换就自增 1 。    
『 i = 4 』时,表达式 ( i < n ) 不成立,排序结束。

顺序输出为 [ 1 2 4 6 ]。

地精排序算法代码
 1template <class T>
2void gnome_sort_1(T data[], int n, bool comparator(T, T)){
3    int i = 1;
4    while (i < n){
5       if (i > 0 && comparator(data[i], data[i-1])){
6           swap(data[i], data[i-1]);
7           i--;
8       }else{
9           i++;
10       }
11    }
12}

这种地精排序算法还有很多优化的空间,这里小吴就不展开来讲了。

End

鸡尾酒排序和地精排序虽然被程序员小吴归为奇葩排序一类,但是它们还是有一定的使用场景的。

  • 在「大部分元素有序」的情况下,使用鸡尾酒排序可以减少排序的回合数。

  • 地精排序最著名的特点是代码只有一层循环,在「大部分元素有序」的情况下,可以减少排序回合数。



●编号848,输入编号直达本文

●输入m获取文章目录

推荐↓↓↓

人工智能与大数据技术

更多推荐25个技术类公众微信

涵盖:程序人生、算法与数据结构、黑客技术与网络安全、大数据技术、前端开发、Java、Python、Web开发、安卓开发、iOS开发、C/C++、.NET、Linux、数据库、运维等。

登录查看更多
0

相关内容

排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。分内部排序和外部排序。若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。反之,若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。内部排序的过程是一个逐步扩大记录的有序序列长度的过程。
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
专知会员服务
30+阅读 · 2020年5月20日
【CVPR2020-旷视】DPGN:分布传播图网络的小样本学习
专知会员服务
26+阅读 · 2020年4月1日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
Github标星4w+,如何用Python实现所有算法
七月在线实验室
5+阅读 · 2019年5月21日
最全Python算法实现资源汇总!
AI100
3+阅读 · 2019年5月13日
Github标星2w+,热榜第一,如何用Python实现所有算法
大数据文摘
7+阅读 · 2019年4月28日
GitHub超2.7万星,最全Python入门算法来了
新智元
5+阅读 · 2019年4月28日
GitHub标星2.6万!Python算法新手入门大全
量子位
3+阅读 · 2019年4月27日
这个开源项目有意思,用动画教你学算法
算法与数据结构
4+阅读 · 2018年12月27日
决策树
Datartisan数据工匠
4+阅读 · 2018年4月19日
用Python制作3D动画
Python程序员
30+阅读 · 2018年1月17日
The Evolved Transformer
Arxiv
5+阅读 · 2019年1月30日
VIP会员
相关VIP内容
最新《自动微分手册》77页pdf
专知会员服务
100+阅读 · 2020年6月6日
专知会员服务
30+阅读 · 2020年5月20日
【CVPR2020-旷视】DPGN:分布传播图网络的小样本学习
专知会员服务
26+阅读 · 2020年4月1日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
224+阅读 · 2020年3月22日
【资源】100+本免费数据科学书
专知会员服务
107+阅读 · 2020年3月17日
相关资讯
Github标星4w+,如何用Python实现所有算法
七月在线实验室
5+阅读 · 2019年5月21日
最全Python算法实现资源汇总!
AI100
3+阅读 · 2019年5月13日
Github标星2w+,热榜第一,如何用Python实现所有算法
大数据文摘
7+阅读 · 2019年4月28日
GitHub超2.7万星,最全Python入门算法来了
新智元
5+阅读 · 2019年4月28日
GitHub标星2.6万!Python算法新手入门大全
量子位
3+阅读 · 2019年4月27日
这个开源项目有意思,用动画教你学算法
算法与数据结构
4+阅读 · 2018年12月27日
决策树
Datartisan数据工匠
4+阅读 · 2018年4月19日
用Python制作3D动画
Python程序员
30+阅读 · 2018年1月17日
Top
微信扫码咨询专知VIP会员