视频动画 | 什么是鸡尾酒排序?

鸡尾酒排序其实就是冒泡排序的变形,它的时间复杂度和冒泡排序一样,都是O(n^2),比快速排序要慢不少。

鸡尾酒排序算法

鸡尾酒排序的思想有点像摆钟一样,从左到右,又从右到左。而冒泡排序只是单向执行。

鸡尾酒排序也是交换排序,假设做一个升序排序,先从左到右,交换一趟把最大的数放置右边,然后从右到左,把最小的数放置左边。

视频动画

Code

Result

初始状态 [5, 1, 9, 3, 7, 4, 8, 6, 2]
从左到右发生交换 [1, 5, 9, 3, 7, 4, 8, 6, 2]
从左到右发生交换 [1, 5, 3, 9, 7, 4, 8, 6, 2]
从左到右发生交换 [1, 5, 3, 7, 9, 4, 8, 6, 2]
从左到右发生交换 [1, 5, 3, 7, 4, 9, 8, 6, 2]
从左到右发生交换 [1, 5, 3, 7, 4, 8, 9, 6, 2]
从左到右发生交换 [1, 5, 3, 7, 4, 8, 6, 9, 2]
从左到右发生交换 [1, 5, 3, 7, 4, 8, 6, 2, 9]
从右到左发生交换 [1, 5, 3, 7, 4, 8, 2, 6, 9]
从右到左发生交换 [1, 5, 3, 7, 4, 2, 8, 6, 9]
从右到左发生交换 [1, 5, 3, 7, 2, 4, 8, 6, 9]
从右到左发生交换 [1, 5, 3, 2, 7, 4, 8, 6, 9]
从右到左发生交换 [1, 5, 2, 3, 7, 4, 8, 6, 9]
从右到左发生交换 [1, 2, 5, 3, 7, 4, 8, 6, 9]
从左到右发生交换 [1, 2, 3, 5, 7, 4, 8, 6, 9]
从左到右发生交换 [1, 2, 3, 5, 4, 7, 8, 6, 9]
从左到右发生交换 [1, 2, 3, 5, 4, 7, 6, 8, 9]
从右到左发生交换 [1, 2, 3, 5, 4, 6, 7, 8, 9]
从右到左发生交换 [1, 2, 3, 4, 5, 6, 7, 8, 9]

优化 减少不必要的交换

看了前面冒泡排序和快速排序,我相信优化是一项学习的重点,以后面试中可以把这项说说来,展示出你的实力。

这次我们就优化不必要的交换次数,come on!

我么通过移除swap函数的调用,从而让程序运行的更快一点。每次进行符合条件判断时,不做交换,让最大或者最小的数据做一个标记,待全部比较完之后,才进行做交换。

视频动画

Code

Result

初始状态 [5, 1, 9, 3, 7, 4, 8, 6, 2]
从左到右发生交换 [5, 1, 2, 3, 7, 4, 8, 6, 9]
从右到左发生交换 [1, 5, 2, 3, 7, 4, 8, 6, 9]
从左到右发生交换 [1, 5, 2, 3, 7, 4, 6, 8, 9]
从右到左发生交换 [1, 2, 5, 3, 7, 4, 6, 8, 9]
从左到右发生交换 [1, 2, 5, 3, 6, 4, 7, 8, 9]
从右到左发生交换 [1, 2, 3, 5, 6, 4, 7, 8, 9]
从左到右发生交换 [1, 2, 3, 5, 4, 6, 7, 8, 9]
从右到左发生交换 [1, 2, 3, 4, 5, 6, 7, 8, 9]

原文地址:https://www.cnblogs.com/wotxdx/p/12004092.html

时间: 2024-11-01 18:21:21

视频动画 | 什么是鸡尾酒排序?的相关文章

排序算法之鸡尾酒排序

昨天中午北京温度为40度,在中午12:16分我来到篮球场,思考了1分钟决定开站 转球: 我和另外3名队友开始半场, 球传到我手的刹那顿时烫的我持球不稳,顿时问道了淡淡的胶皮味道和烤肉味道的混搭. 这时我来了一个腾空跳投, 球---------爆炸了........ 听新闻说昨天在路上都是 "熟人" 一位老大爷不慎被车刮倒了,大爷二话没说立马爬了起来,围观众人议论纷纷: "大爷人不错","大爷素质真高","大爷身体可真好" 大爷

视频动画 | 什么是快速排序?

快速排序属性 上一篇文章介绍了冒泡排序和它的优化.这次介绍的快速排序是冒泡排序演变而来的算法,比冒泡排序要高效的很多. 快速排序之所以快,是因为它使用了分治法.它虽然也是通过不断的比较和移动来实现排序的,只不过它的实现,增大了比较的距离和移动的距离.而冒泡排序只是相邻的比较和交换. 快速排序的思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的. 从字面上感觉不到它的好处,我们通过一个示例

鸡尾酒排序Cocktail sort

鸡尾酒排序基于冒泡排序,双向循环 还是看例子吧,给定待排数组[2 3 4 5 1] 第一趟过去时的每一步 第一步迭代,2 < 3不换 [2 3 4 5 1] 第二步迭代,3 < 4不换 [2 3 4 5 1] 第三步迭代,4 < 5不换 [2 3 4 5 1] 第四步迭代,5 > 1交换 [2 3 4 1 5] 第一趟回来时的第一步,鸡尾酒一次到头后就回返回来,再到头后再过去,来回比,一个来回能排两个数字 第五步迭代,1 < 5不交换 [2 3 4 1 5] 第六步迭代,1

数据结构——排序——鸡尾酒排序算法

鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 使用鸡尾酒排序为一列数字进行排序的过程 鸡尾酒算法原理 i. 先对数组从左到右进行升序的冒泡排序:  ii. 再对数组进行从右到左的降序的冒泡排序:  iii. 以此类推,持续的.依次的改变冒泡的方向,并不断缩小没有排序的数组范围: 例:         88     7     79     64     55     98     48     52    

鸡尾酒排序(双冒泡排序、搅拌排序或涟漪排序)

using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace Sort { class CockTailSorter { private static int[] myArray; private static int arraySize; public static int[] Sort(int[] myArray) { arraySize = myArray.Len

简单排序,冒泡排序,鸡尾酒排序,快速排序

简单排序:每次找出最大(小)的数,从头开始依次排序. 1 public static int[] simplySort(int a[]) { 2 for (int i = 0; i < a.length - 1; i++) { 3 // int min = a[i]; 4 int minIndex = i; 5 for (int j =i + 1; j < a.length; j++) { 6 //我的代码 7 // if (a[j] < min) { 8 // min = a[j];

经典算法题每日演练——第二十三题 鸡尾酒排序

原文:经典算法题每日演练--第二十三题 鸡尾酒排序 这篇我们继续扯淡一下鸡尾酒排序,为了知道为啥取名为鸡尾酒,特意看了下百科,见框框的话,也只能勉强这么说了. 要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫“双向冒泡排序”,我想作为码农的话,不可能不知道冒泡排序, 冒泡是一个单向的从小到大或者从大到小的交换排序,而鸡尾酒排序是双向的,从一端进行从小到大排序,从另一端进行从大 到小排序. 从图中可以看到,第一次正向比较,我们找到了最大值9. 第一次反向比较,我们找到了最小值1. 第二次正向

Hark的数据结构与算法练习之鸡尾酒排序

算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从高向低交换着进行排序.大家看一下代码就知道了. 某些特殊有序数组情况下,鸡尾酒排序是效率略好于冒泡排序,例如: int[] arrayData = { 2, 3, 4, 5, 6, 7, 8, 9, 1 }; 鸡尾酒排序只排序一次就能出结果,而冒泡排序就需要8次才能出结果. 代码 使用的是java

排序高级之交换排序_鸡尾酒排序

鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形.此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序. 与冒泡排序不同的地方: 鸡尾酒排序等于是冒泡排序的轻微变形.不同的地方在于从低到高然后从高到低,而冒泡排序则仅从低到高去比较序列里的每个元素.他可以得到比冒泡排序稍微好一点的效能,原因是冒泡排序只从一个方向进行比对(由低到高),每次循环只移动一个项目. 以序列(2,3,4,