前言:

鸡尾酒排序,为什么叫这个名字呢。因为摇鸡尾酒的时候会上下上下的晃,这个排序,就像摇酒一样,先从前往后排序,再从后往前排序,再重复。从这个角度来看,其实他就是一个两头的冒泡排序。

所以,他的时间复杂度最差是O(n^2),最好是O(n)。为啥是O(n),是由于这个排序不仅优化了冒泡只从一头的弊端,同时也增加了一个标记量。之前我们提到过,冒泡排序相对于选择排序的优点就是他能在一定的排序次数以后,保证数列达到一种相对有序的状态。而如果我们已经有序了,我们某次不进行交换,显然排序就已经完成了,我们没有必要继续排序。因此,最优的时间复杂度只需要遍历一遍,就完成了,因此是O(n)。

空间复杂度O(1),未开辟辅助数组。

思路:

就是从两头冒泡排序,因此我们首先外层循环要变成原来的一半。

然后是内层循环,先从两头哪边开始冒泡都无所谓,我选择从左边开始冒泡。这边的下标需要注意一下,和普通的冒泡排序有一定的差距。我直接注释在代码中了,这边。

然后是标记量设置的位置,我们需要设置在外层循环的内部,因为需要跳出的是外层循环。然后如果某次操作进行了交换,说明目前还没有达到一个很有序的状态,我们把标记量记录一下。我这边用的是赋值为1,其实有点那啥,每次都赋值1感觉计算机会被气死哈哈哈,也可以用自增之类的。

void CocktailSort(int *a,int length)
{int mid_length = length / 2;int i, j;for (i = 0; i < mid_length ; i++){
//这个mark就是我设置的标记量,一定要放外层里头哦int mark = 0;
//这边从i开始是因为每次冒泡也有从右边冒过来的泡泡,所以用i,思考一下for (j = i; j < length - i - 1; j++){if (a[j] > a[j+1]){swap(&a[j],&a[j+1]);mark = 1;}}
//这边之所以用j-1是因为上面那次循环将j移动到了数组还需要排序的最后一个下标+1那里,想一想for (j = j - 1; j > i; j--){if (a[j-1] > a[j]){swap(&a[j-1], &a[j]);mark = 1;}}if (mark == 0)break;}
}

测试代码:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 30//之前写过了,就不再全写一遍了
void generate_random_number(int*, int, int);
void swap(int*, int*);void CocktailSort(int *a,int length)
{int mid_length = length / 2;int i, j;for (i = 0; i < mid_length ; i++){int mark = 0;for (j = i; j < length - i - 1; j++){if (a[j] > a[j+1]){swap(&a[j],&a[j+1]);mark = 1;}}for (j = j - 1; j > i; j--){if (a[j-1] > a[j]){swap(&a[j-1], &a[j]);mark = 1;}}if (mark == 0)break;}
}int main()
{int arr[N + 10] = { 0 };generate_random_number(arr, 0, 1024);CocktailSort(arr ,N);printf("排序后数列:\n");for (int i = 0; i < N; i++)printf("%d ", arr[i]);printf("\n");return 0;
}

测试结果:

至此,鸡尾酒排序完成。

CocktailSort/ShakerSort(鸡尾酒排序)——C语言实现相关推荐

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

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

  2. C语言实现鸡尾酒排序

    鸡尾酒排序算法: void cocktailSort(int A[], int n){int left = 0;int right = n - 1;while (left != right) {for ...

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

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

  4. 鸡尾酒排序算法c语言源代码,排序算法之鸡尾酒排序

    5.3 鸡尾酒排序(Cocktail sort) 既然介绍了冒泡排序.就不得不说一下冒泡排序最为重要的一个变种--鸡尾酒排序(也称为定向冒泡排序).此算法与冒泡排序的不同之处在于鸡尾酒排序是双向进行的 ...

  5. 鸡尾酒排序算法c语言源代码,排序算法 -鸡尾酒排序

    简介 鸡尾酒排序是冒泡排序的一种,又称为来回排序.它比冒泡排序要高级点, 冒泡排序的每一个元素都可以像小气泡一样,根据自身大小,一点一点地向着数组的一侧移动.算法的每一轮都是从左到右来比较元素,进行单 ...

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

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

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

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

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

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

  9. 理论基础 —— 排序 —— 鸡尾酒排序

    [概述] 鸡尾酒排序也称定向冒泡排序,是一种稳定的排序方法,其是原始冒泡排序的改进,也是交换排序的一种. 定向冒泡排序与冒泡排序的不同在于其从低到高比较,然后再从高到低比较,如此循环往复,直到序列有序 ...

最新文章

  1. C语言中static详细分析
  2. 深入剖析OkHttp系列(五) 来自官方的事件机制
  3. 分享:几款代码混淆器(DotFuscator, .NET Reactor, xenocode)
  4. struts2+spring3+hibernate3整合(二)转载
  5. VS2010 手动为控件添加事件处理函数
  6. 清单文件,测试,打电话和发短信应用
  7. BZOJ 4517 组合数+错排
  8. linux18配置静态ip,ubuntu18配置静态IP地址
  9. MSXML应用总结 开发篇(上)
  10. Excel文件转换为XML以及Linux文件编码格式转换
  11. More Grounded Image Captioning by Distilling Image-Text Matching Model
  12. 条件随机场(Conditional random field,CRF)
  13. Day739.GEO经纬度数据结构自定义数据结构 -Redis 核心技术与实战
  14. 软件测试工程师简历项目经验怎么写?--10000个已成功入职的软件测试工程师简历范文模板(含北凡老师的真实简历)
  15. js 解决移动端苹果自带输入法的连续输入多打重复字的问题
  16. EXCEL 2010怎样固定表头
  17. 宏转录组方法_最后一周|高级转录组分析和R语言数据可视化第十二期 (线上线下同时开课)...
  18. Java学习专栏!全网最牛!
  19. Apache Calcite教程 -目录
  20. Google财富传奇

热门文章

  1. 泡泡玛特再陷信任危机:二次售卖盲盒时有发生,上半年赚了1.4亿
  2. 在线教育行业加速数字化转型,在人工智能新“高途”上升维竞争
  3. 食油大学C++程序设计题解
  4. linux热点连上不通,一个WiFi模块开出多个热点(不可连接)
  5. 压力测试工具之FIO
  6. 10个新技术让明年的科技产品更牛掰
  7. 计蒜客习题:帕吉的肉钩
  8. hive UDF 根据ip解析地理位置信息
  9. remoteapp提示找不到远程计算机_知乎高赞:985 计算机视觉毕业后找不到工作怎么办?怒刷 leetcode,还是另寻他路?...
  10. 取中文拼音首字母,提供了多音字的选择 js javascript c# java 存储过程