这篇我们来聊一下鸡尾酒排序,为了知道为啥取名为鸡尾酒,特意看了下百科,见框框的话,也只能勉强这么说了。

要是文艺点的话,可以说是搅拌排序,通俗易懂点的话,就叫“双向冒泡排序”,我想作为码农的话,不可能不知道冒泡排序,冒泡是一个单向的从小到大或者从大到小的交换排序,而鸡尾酒排序是双向的,从一端进行从小到大排序,从另一端进行从大到小排序。

从图中可以看到:

  • 第一次正向比较,我们找到了最大值 9.

  • 第一次反向比较,我们找到了最小值 1.

  • 第二次正向比较,我们找到了次大值 8.

  • 第二次反向比较,我们找到了次小值 2

  • 。。。

  • 最后就大功告成了。

下面我们看看代码:


namespace ConsoleApplication1
{class Program{static void Main(string[] args){List<int> list = new List<int>() { 8, 1, 4, 2, 9, 5, 3 };Console.WriteLine("\n排序前 => {0}\n", string.Join(",", list));list = CockTailSort(list);Console.WriteLine("\n排序后 => {0}\n", string.Join(",", list));Console.Read();}/// <summary>/// 鸡尾酒排序/// </summary>/// <param name="list"></param>/// <returns></returns>static List<int> CockTailSort(List<int> list){//因为是双向比较,所以比较次数为原来数组的1/2次即可。for (int i = 1; i <= list.Count / 2; i++){//从前到后的排序 (升序)for (int m = i - 1; m <= list.Count - i; m++){//如果前面大于后面,则进行交换if (m + 1 < list.Count && list[m] > list[m + 1]){var temp = list[m];list[m] = list[m + 1];list[m + 1] = temp;}}Console.WriteLine("正向排序 => {0}", string.Join(",", list));//从后到前的排序(降序)for (int n = list.Count - i - 1; n >= i; n--){//如果前面大于后面,则进行交换if (n > 0 && list[n - 1] > list[n]){var temp = list[n];list[n] = list[n - 1];list[n - 1] = temp;}}Console.WriteLine("反向排序 => {0}", string.Join(",", list));}return list;}}
}

从结果上面看,我们会发现,当数组有序的时候,我们还会继续往下排,直到完成 length/2 次,这个就跟没优化之前的冒泡排序一样,此时我们可以加上一个标志位IsSorted 来判断是否已经没有交换了,如果没有,提前退出循环。。。

/// <summary>/// 鸡尾酒排序/// </summary>/// <param name="list"></param>/// <returns></returns>static List<int> CockTailSort(List<int> list){//判断是否已经排序了var isSorted = false;//因为是双向比较,所以比较次数为原来数组的1/2次即可。for (int i = 1; i <= list.Count / 2; i++){//从前到后的排序 (升序)for (int m = i - 1; m <= list.Count - i; m++){//如果前面大于后面,则进行交换if (m + 1 < list.Count && list[m] > list[m + 1]){var temp = list[m];list[m] = list[m + 1];list[m + 1] = temp;isSorted = true;}}Console.WriteLine("正向排序 => {0}", string.Join(",", list));//从后到前的排序(降序)for (int n = list.Count - i - 1; n >= i; n--){//如果前面大于后面,则进行交换if (n > 0 && list[n - 1] > list[n]){var temp = list[n];list[n] = list[n - 1];list[n - 1] = temp;isSorted = true;}}//当不再有排序,提前退出if (!isSorted)break;Console.WriteLine("反向排序 => {0}", string.Join(",", list));}return list;}

好了,这样就比较完美了,希望本篇对您有帮助。

数据结构与算法专题——第九题 鸡尾酒排序相关推荐

  1. 数据结构与算法专题——第九题 外排序

    说到排序,大家第一反应基本上是内排序,是的,算法嘛,玩的就是内存,然而内存是有限制的,总有装不下的那一天,此时就可以来玩玩外排序,当然在我看来,外排序考验的是一个程序员的架构能力,而不仅仅局限于排序这 ...

  2. 数据结构与算法专题——第一题 Bitmap算法

    在所有具有性能优化的数据结构中,我想大家使用最多的就是hash表,是的,在定位查找场景上具有O(1)的常量时间,多么的简洁优美, 但是在特定的场合下: ①:对10亿个不重复的整数进行排序. ②:找出1 ...

  3. 数据结构与算法专题——第二题 优先队列

    前段时间玩小爬虫的时候,我把url都是放在内存队列里面,有时我们在抓取url的时候,通过LCS之类的相似度比较,发现某些url是很重要的,需要后端解析服务器优先处理,针对这种优先级比较大的url,普通 ...

  4. 数据结构与算法笔记 —— 十大经典排序及算法的稳定性

    一.十大经典排序算法 排序算法是<数据结构与算法>中最基本的算法之一. 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全 ...

  5. 算法与数据结构_数据结构与算法专题--算法基本概念

    很多开发者都知道"程序=数据结构+算法"这个著名的公式,并不真正明白算法的定义或概念.究竟什么是算法呢?从字面意义上理解,算法即用于计算的方法,通过这种方法可以达到预期的计算结果. ...

  6. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题

    横空出世,席卷互联网                      ---评微软数据结构+算法面试100题 作者:July. 时间:2010年10月-11月.版权所有,侵权必究. 出处:http://bl ...

  7. 横空出世,席卷互联网--评微软等公司数据结构和算法面试100题 .

    入 编程这一行之初,便常听人说,要多动手写代码.可要怎么写列?写些什么列?做些什么列? c语言程序设计100例,太过基础,入门之后,挑战性不够.直接做项目,初学者则需花费大量的时间与精力.且得有一定能 ...

  8. 数据结构与算法之-----图(拓扑排序)

    [​​​​​​​ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于​​​​​​​初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...

  9. 排序算法之冒泡排序及鸡尾酒排序

    目录 一.排序算法的分类 二.冒泡排序 1.原始的冒泡排序 2.改进一步的冒泡排序 3.更进一步的冒泡排序 三.鸡尾酒排序 四.完整测试代码 一.排序算法的分类 在介绍排序算法之前,我们先根据时间复杂 ...

最新文章

  1. python判断实例的类型
  2. Ospaf项目-commits词频统计模块
  3. 【设计模式】加薪非要老总批 --- 职责链模式
  4. 入侵Jasper以获取JSP页面的对象模型
  5. 开源技术、开放使用、业务导向的大数据平台,助力银行数字化转型
  6. linux grub内核选择,UBUNTU GRUB没有内核选项,怎么回事啊?
  7. vue-cli 可视化工具
  8. 《测绘程序开发实习》导线网平差 C++上机实验报告 CSU
  9. 数据--第25课 - 队列课后练习
  10. pgadmin4下载
  11. cubemx配置时调试SYS显示警报
  12. 企业内部网路怎么防止网络出现环路?
  13. DDR MC DFI PHY
  14. goland切换换行/不换行快捷键
  15. 用js实现数组去除重复的元素方法
  16. intrins.h 简介
  17. FPGA交通灯 Verilog Modelsim
  18. loopy()代表什么意思,怎么用
  19. 关于安卓自定义进度条(二)
  20. 最优化理论公式大赏(上)

热门文章

  1. SQL Server中,with as使用介绍
  2. 学习环境配置:Manjaro、MSYS2以及常见软件
  3. 玩转Javascript 给JS写测试
  4. mysql在linux下修改存储路径
  5. 十个必备的.NET开发小工具(1):Snippet Compiler
  6. Linux内核里的“智能指针” (续)
  7. coolite TreeNode NodeClick传id到后台的方法
  8. 解决nginx不支持pathinfo Thinkphp命名空间问题
  9. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字
  10. [每日一题] 11gOCP 1z0-052 :2013-09-23 Oracle11g 内存参数设置...................................C7...