这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点。

上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同样这里的梳排序也是在冒泡排序上做了一些优化。

冒泡排序上我们的选择是相邻的两个数做比较,就是他们的gap为1,其实梳排序提出了不同的观点,如果将这里的gap设置为一定的大小,

效率反而必gap=1要高效的多。

 下面我们看看具体思想,梳排序有这样一个1.3的比率值,每趟比较完后,都会用这个1.3去递减gap,直到gap=1时变成冒泡排序,这种

算法比冒泡排序的效率要高效的多,时间复杂度为O(N2/2p)  这里的p为增量,是不是跟希尔排序有点点神似。。。

比如下面有一组数据: 初始化的gap=list.count/1.3, 然后用这个gap作为数组下标进行跨数字比较大小,前者大于后者则进行交换,

每一趟排序完成后都除以1.3, 最后一直除到gap=1

最后我们的数组就排序完毕了,下面看代码:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Xml.Xsl;
 6
 7 namespace ConsoleApplication1
 8 {
 9     class Program
10     {
11         static void Main(string[] args)
12         {
13             List<int> list = new List<int>() { 8, 1, 4, 2, 9, 5, 3 };
14
15             Console.WriteLine("\n排序前 => {0}\n", string.Join(",", list));
16
17             list = CombSort(list);
18
19             Console.WriteLine("\n排序后 => {0}\n", string.Join(",", list));
20
21             Console.Read();
22         }
23
24         /// <summary>
25         /// 梳排序
26         /// </summary>
27         /// <param name="list"></param>
28         /// <returns></returns>
29         static List<int> CombSort(List<int> list)
30         {
31             //获取最佳排序尺寸: 比率为 1.3
32             var step = (int)Math.Floor(list.Count / 1.3);
33
34             while (step >= 1)
35             {
36                 for (int i = 0; i < list.Count; i++)
37                 {
38                     //如果前者大于后者,则进行交换
39                     if (i + step < list.Count && list[i] > list[i + step])
40                     {
41                         var temp = list[i];
42
43                         list[i] = list[i + step];
44
45                         list[i + step] = temp;
46                     }
47
48                     //如果越界,直接跳出
49                     if (i + step > list.Count)
50                         break;
51                 }
52
53                 //在当前的step在除1.3
54                 step = (int)Math.Floor(step / 1.3);
55             }
56
57             return list;
58         }
59     }
60 }

转载于:https://www.cnblogs.com/huangxincheng/p/3577579.html

经典算法题每日演练——第二十四题 梳排序相关推荐

  1. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  2. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

  3. 经典算法题每日演练——第十题 树状数组

    原文:经典算法题每日演练--第十题 树状数组 有一种数据结构是神奇的,神秘的,它展现了位运算与数组结合的神奇魅力,太牛逼的,它就是树状数组,这种数据结构不是神人是发现不了的. 一:概序 假如我现在有个 ...

  4. 经典算法题每日演练——第二十一题 十字链表

    上一篇我们看了矩阵的顺序存储,这篇我们再看看一种链式存储方法"十字链表",当然目的都是一样,压缩空间. 一:概念 既然要用链表节点来模拟矩阵中的非零元素,肯定需要如下5个元素(ro ...

  5. 每日一题冲刺大厂 第二十四天 开心的金明

    大家好,我是泡泡,给大家带来每日一题的目的是为了更好的练习算法,我们的每日一题为了让大家练到各种各样的题目,熟悉各种题型,一年以后,蜕变成为一个不一样的自己!

  6. 【第二十四题】逻辑闭环(北理工/北京理工大学/程序设计方法与实践/小学期 )

    目录 Description 思路 代码 Description 小张是一位推理迷,他非常喜欢看侦探小说与侦探电影.同时他也会玩一些推理游戏,在侦探游戏中,小张需要发掘事件之间的联系.通过一条线索,他 ...

  7. 第二十四题——[ZJCTF 2019]NiZhuanSiWei

    题目地址:https://buuoj.cn/challenges 解题思路 第一步:进入题目,展示了php代码 第二步:使用data协议绕过text参数检测 经过代码分析,text参数不能为空,且根据 ...

  8. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

  9. 经典算法题每日演练——第一题 百钱买百鸡

    经典算法题每日演练--第一题 百钱买百鸡 原文:经典算法题每日演练--第一题 百钱买百鸡 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱, ...

最新文章

  1. git ignore linux,为什么说.gitignore不能忽视
  2. 国外同行关注啥——digg.com网站Programming分类每周热点[12/17 - 12/23]
  3. Lucene之删除索引(备忘)
  4. DNS域名解析服务(正向解析,反向解析,主从解析)
  5. python当用户输入的不是整数_当用户输入字符串而不是整数时,如何保护我的python代码?...
  6. hdu Candy Sharing Game
  7. 可爱的朋友,你是否有很多问号
  8. windows下创建目录函数_mkdir
  9. android检查内存泄露工具,Android内存泄露检测 LeakCanary2.0(Kotlin版)的实现原理
  10. 挤房工具发布--支持最新版浩方和VS平台
  11. ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  12. 11.4.8 YEAR(date)函数
  13. C#学习笔记8 事件
  14. 怎样才能压缩PDF文件大小
  15. 使用这5款模拟器访问备选操作系统
  16. 【Windows 问题系列第 14 篇】如何删除 Win10 系统自带的微软拼音输入法
  17. 深入理解c语言的操作符 ----【汇总】
  18. java8个基本类型
  19. 蘑菇云「行空板Python入门教程」第八课:智慧农业可视化系统
  20. win10屏幕录像哪个好用?这2款录屏软件值得推荐!

热门文章

  1. 过新年,换新机,现在购买5G手机划算吗?
  2. 5.11socket选项
  3. 接口测试工具Postman接口测试图文教程
  4. TCP/PI参考模型(应用层、传输层、网际层、网络接口层)、五层参考模型(应用层、传输层、网络层、数据链路层、物理层)、OSI与TCP/IP参考模型比较...
  5. [leetcode]84. Largest Rectangle in Histogram c语言
  6. 构建azure对话机器人_如何在5分钟内使用Azure创建聊天机器人
  7. @sql 单元测试_简单单词中使用tSQLt进行的常规SQL单元测试
  8. 德鲁伊 oltp oltp_内存中OLTP –招待看门狗的三个关键点–检查点文件
  9. 构建Electron的常见问题(Mac)
  10. NSURLConnection-网络访问(同步异步)