5.3 鸡尾酒排序(Cocktail sort)

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

关于两种排序的效率方面,鸡尾酒排序在某些情况下比冒泡排序略微好那么一点点。

只是,在大部分乱序的情况下,鸡尾酒排序与冒泡排序的效率都非常差劲。

以数组{2,8,7,1,3}为例。鸡尾酒排序过程如图5-3所看到的。

其排序过程,也可參照例如以下动态图。

该动态图的原始链接为:http://zh.wikipedia.org/wiki/File:Sorting_shaker_sort_anim.gif

C代码实现:

#include #include #include void exchange(int &a, int &b) {

int temp = a;

a = b;

b = temp;

}

//鸡尾酒排序

void cocktail_sort(int a[], int length) {

for(int i=0; i=0; j++) {

index = length-j-2;

if( a[index]>a[index+1] ) {

exchange(a[index], a[index+1]);

}

}

i++;

//将较大的数换到数组末尾

for(int j=(i+1)/2; ja[index+1] ) {

exchange(a[index], a[index+1]);

}

}

i++;

}

}

int main(int argc, char** argv) {

const int length = 10;

int a[length];

//告诉rand方法,以time为种子去生成随机数

srand( (unsigned)time(NULL) );

for(int i=0; iC++代码实现为:

#include #include #include #include using namespace std;

void exchange(int &a, int &b){

int temp = a;

a = b;

b = temp;

}

void cocktail_sort(vector&a) {

vector::iterator itStart = a.begin();

vector::iterator itEnd = a.end();

for(size_t i=0; i::iterator jt=itEnd-2-i/2; jt>=i/2+itStart; jt-- ) {

if( *(jt)>*(jt+1) ) {

exchange(*(jt), *(jt+1));

}

//防止操作到vector以外的空间

if( jt==itStart ){

break;

}

}

i++;

//将较大的数换到数组末尾

for(vector::iterator jt=(i+1)/2+itStart; jt*(jt+1) ) {

exchange(*(jt), *(jt+1));

}

//防止操作到vector以外的空间

if( jt==itEnd-2 ){

break;

}

}

i++;

}

}

void show(vector&a){

for(vector::iterator it=a.begin(); it(time(NULL)) );

for(int i=0; iaVec(a, a+length);

show(aVec);

cocktail_sort(aVec);

show(aVec);

return 0;

}

鸡尾酒排序算法c语言源代码,排序算法之鸡尾酒排序相关推荐

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

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

  2. c语言排序教学过程,C语言中冒泡排序算法教学设计

    排序是计算机科学中一项重要的技术,其应用范围广.使用频率高,因此对于排序算法的研究一直是计算机专家的重点.高校的程序设计类课程也将排序算法作为重难点进行教学. 1常见的几种排序算法 1.1算法的基本概 ...

  3. 卡尔曼滤波算法c语言stm32,卡尔曼滤波算法及C语言实现_源代码

    a往南向北 2019-01-16 20:39:20  11340  收藏 111 分类专栏: C语言嵌入式 文章标签: 卡尔曼滤波 C代码 卡尔曼滤波理论很容易就可以在MATLAB软件环境下实现,但是 ...

  4. 弗洛伊德算法c语言path,Floyd算法(弗洛伊德算法)

    算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ...

  5. c语言考试算法,c语言考试常用算法docx.docx

    c语言考试常用算法docx 求1~100的累加和#includevoid main(){inti=1,sum=0;while (i<=100){sum+=i;i++;}printf(" ...

  6. c代码实现 ifft运算_fft算法c语言_matlab fft算法_ifft c语言

    FFT快速算法C程序_工学_高等教育_教育专区.电子信息工程综合课程设计报告书 DSP 课程设计 报告 题学 目: 院: FFT 快速算法 C 程序 计算机与信息工程学院 09 ... fft算法代码 ...

  7. 时钟页面置换算法c语言,clock置换算法例题(改进clock置换算法例题讲解)

    Clock页面置换算法: 6)动态给出页面调用序列并进行调度: 7)输出置换结. C++编程要? 考试用 哪位大侠 帮帮 快点 谢谢了 这很简单啊,要打字太多了.不过网上这类算法举例很少,就看你怎么理 ...

  8. c语言编程实现dsa算法,C语言实现DSA算法(不包括质数生成)

    1.头文件部分 #include #include #include 2.判断大数是不是0或1 参见<C语言实现RSA算法> 3.大数加减乘除幂模 参见<C语言实现RSA算法> ...

  9. 用c语言编写银行家算法,C语言实现银行家算法

    <C语言实现银行家算法>由会员分享,可在线阅读,更多相关<C语言实现银行家算法(8页珍藏版)>请在人人文库网上搜索. 1.C语言实现银行家算法(源码.运行结果)一. 源码/* ...

  10. 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)

    最佳置换算法(OPT) 什么是OPT 最佳置换算法,其所选择的被淘汰的页面将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面.采用最佳置换算法通常可保证最低的缺页率.但是人们目前还无法与之, ...

最新文章

  1. 如何实现显示超过10个字符就显示省略号?
  2. Silverlight OA源代码(Silverlight4+SQLServer2005)
  3. react怎么存上一页_如何实现 React 中的状态自动保存?
  4. 用Python进行SQLite数据库操作
  5. SSL加密包解析的几个概念梳理
  6. WPF canvas、基本图形、path几个示例
  7. RTC-IC-PCF2129
  8. 产品设计中的点线面法则
  9. Python多线程和队列结合demo
  10. Linux打包压缩解压缩tar、gzip、bzip2
  11. laravel 图片上传 intervention/image
  12. stata软件meta分析模块安装教程
  13. vue安装axios
  14. 原生JS路由实现页面跳转
  15. python3 调用http接口例子
  16. 陕西副市长猝死,其“豪宅”爆光震惊国人
  17. 2021-06-05 高效的wms仓储管理系统是关键
  18. 经典计算机模型,经典Volterra模型分界线的计算机模拟
  19. ChromeFK插件推荐系列九:PDF插件推荐
  20. 实验室设备测量超低偏置电流的实用技巧

热门文章

  1. 一文带你读懂“亚当理论”的精髓:期货股票交易操作守则与操作技巧
  2. 堡垒机如何传输文件_如何在linux下向堡垒机传文件
  3. 操作系统bootloader是什么
  4. 获得ios屏幕上的像素
  5. web开发一定时间没操作_Web开发—明智地投资您的时间
  6. 暑期ACM模拟赛--2017ACM/ICPC亚洲区沈阳站-重现赛 【待补】
  7. Python:对图片批量进行重命名
  8. JAVA之模拟注册登录幸运抽奖
  9. 我爱粟裕--与针式PKM的注册用户的QQ对话系列[2]
  10. rj45 千兆接口定义_网线的RJ45接口的针脚定义