当前位置: 首页 > news >正文

基于C#实现梳排序

为什么取名为梳,可能每个梳都有自己的 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.
image.png
最后我们的数组就排序完毕了,下面看代码:

 using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Xml.Xsl;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 = CombSort(list);Console.WriteLine("\n排序后 => {0}\n", string.Join(",", list));Console.Read();}/// <summary>/// 梳排序/// </summary>/// <param name="list"></param>/// <returns></returns>static List<int> CombSort(List<int> list){//获取最佳排序尺寸: 比率为 1.3var step = (int)Math.Floor(list.Count / 1.3);while (step >= 1){for (int i = 0; i < list.Count; i++){//如果前者大于后者,则进行交换if (i + step < list.Count && list[i] > list[i + step]){var temp = list[i];list[i] = list[i + step];list[i + step] = temp;}//如果越界,直接跳出if (i + step > list.Count)break;}//在当前的step在除1.3step = (int)Math.Floor(step / 1.3);}return list;}}}

image.png

http://www.lryc.cn/news/246345.html

相关文章:

  • 盘点72个Android系统源码安卓爱好者不容错过
  • nodejs+vue+elementui足球篮球联赛系统
  • 18.Oracle的过程和函数
  • A JSONObject text must begin with ‘{‘ at 1 [character 2 line 1]
  • C#中openFileDialog控件的使用方法
  • 多线程04 死锁,线程可见性
  • java中文转拼音(去除音调)
  • [Android]常见的数据传递方式
  • <蓝桥杯软件赛>零基础备赛20周--第7周--栈和二叉树
  • 探究Kafka原理-7.exactly once semantics 和 性能测试
  • 【密码学引论】序列密码
  • 知识变现的未来:解析知识付费系统的核心
  • 【Linux基础】Linux常见指令总结及周边小知识
  • 【Android知识笔记】性能优化专题(五)
  • Java基础之泛型
  • WPF实战项目十五(客户端):RestSharp的使用
  • C语言基础篇5:指针(二)
  • 「Verilog学习笔记」非整数倍数据位宽转换8to12
  • Qt_一个由单例引发的崩溃
  • P8A004-系统加固-磁盘访问权限
  • 数智赋能 锦江汽车携手苏州金龙打造高质量盛会服务
  • kolla-ansible 部署OpenStack云计算平台
  • wireshark 抓包提示
  • Redis未授权访问-CNVD-2019-21763复现
  • 汇编:常用的输入与输出
  • MYSQL基础之【正则表达式,事务处理】
  • Mysql并发时常见的死锁及解决方法
  • 二十九、微服务案例完善(数据聚合、自动补全、数据同步)
  • vue 目录树的展开与关闭
  • 【Docker】python flask 项目如何打包成 Docker images镜像 上传至阿里云ACR私有(共有)镜像仓库 集成Drone CI