基于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.hqwc.cn/news/221889.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用不平衡数据集练习机器学习

一、介绍 在当今世界&#xff0c;机器学习和人工智能几乎被广泛应用于每个领域&#xff0c;以提高绩效和结果。但如果没有数据&#xff0c;它们还有用吗&#xff1f;答案是否定的。机器学习算法严重依赖我们提供给它们的数据。我们提供给算法的数据质量在很大程度上决定了机器学…

运动戴耳机哪种款式比较好?十大运动蓝牙耳机品牌排行榜

​运动蓝牙耳机是大家运动时必不可少的装备&#xff0c;不止上耳佩戴稳固舒适&#xff0c;且音质也相当不错&#xff0c;防水性也高&#xff0c;还带来高续航和稳定连接。下面我来给大家推荐几款值得选购的运动耳机&#xff0c;希望大家能找到自己喜欢的那一款。 1.南卡开放式…

Callable、Future和FutrueTask详解

一、Callable介绍 1.1 Runnable介绍 Runnable是一个接口&#xff0c;里面声明了run方法。但是由于run方法返回值类型为void&#xff0c;所以在执行完成任务后&#xff0c;无法返回任何结果。 FunctionalInterface public interface Runnable {public abstract void run(); }…

格雷希尔针对J2044燃油管测试专用快速接头都有哪些及各自的应用场合

J2044燃油管是汽车燃油系统中常见的管口&#xff0c;如&#xff1a;燃油泵、燃油滤清器、喷油嘴等部件中都有这样的管口&#xff0c;为了保证燃油系统的正常运行&#xff0c;这些零部件在出厂前就需要对其进行多种测试&#xff0c;在测试前需要对J2044燃油管管口进行密封用于连…

代码块-Java

代码块-Java 一、介绍二、语法三、好处举例 四、使用细节1、static代码块/静态代码块&#xff0c;随着类的加载而执行&#xff0c;且只执行一次2、 类什么时候被加载 [重要 ! ]案例演示&#xff1a;static代码块 3、普通代码块&#xff0c;在创建对象实例时&#xff0c;会被隐式…

OpenCV检测圆形东西是否存在缺口?

文章目录 前言一、试过的方法二、最终使用的方法1.先极坐标变换2.计算斜率 总结 前言 想了挺久&#xff0c;一直没解决这个问题。后面勉强解决了。 一、试过的方法 1.想用圆度来解决&#xff0c;后来发现圆度差值很小&#xff0c;完整的圆圆度0.89&#xff0c;然后有缺角的圆圆…

初学vue3与ts:setup与setup()下的数据写法

把setup写在script里 <template><div><div class"index-title">script setup</div><div class"title">字符串&#xff1a;</div><div class"title-sub">ref版&#xff1a;{{strRef}}</div><…

Vue3挂载完毕后,隐藏dom再重新加载组件的方法

组件原本是在PC端使用的&#xff0c;现在需要把组件再封装一次&#xff0c;供app调用&#xff0c;但是在app上会显示tag栏&#xff0c;有占位影响空间&#xff0c;所以需求去掉头部tag&#xff0c;只显示下方组件。 实现方法&#xff0c;以前是直接引用的组件&#xff0c;现在改…

minio客户端基本操作

minio客户端基本操作 桶 创建桶 如果要创建新的桶 输入名称&#xff0c;点击创建即可&#xff0c;默认权限就行 删除桶 点击要删除的桶 点击删除 修改桶 如果哪天需要修改桶的权限或者其他信息&#xff0c;还是先点击这个桶进入详情 然后点击要修改的属性&#xff0c;选择…

活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放PPT下载

11月24日“阿里云云原生 Serverless 技术实践营”深圳站圆满落幕。活动受众以关注 Serverless 技术的开发者、企业决策人、云原生领域创业者为主&#xff0c;活动形式为演讲、动手实操&#xff0c;让开发者通过一个下午的时间增进对 Serverless 技术的理解&#xff0c;快速上手…

Fuzz进阶教学——人工智能在模糊测试中的应用

【参考文献】白海波.人工智能技术在模糊测试中的应用[J].数字技术与应用,2023,41(08):16-18.DOI:10.19695/j.cnki.cn12-1369.2023.08.05. 目录 摘要 一、模糊测试简介 1、原理 2、工作流程 3、分类 4、应用领域 二、人工智能在模糊测试中的应用 1、人工智能技术 2、人…

内衣洗衣机怎么选?内衣洗衣机便宜好用的牌子推荐

相信不少用户并不太在意衣服和内衣裤裤能不能同时洗&#xff0c;每次清洗都是把内衣裤与其他衣服一起放入洗衣机清洗&#xff0c;其实内衣裤不能直接跟大件的衣物一起放入洗衣机洗的&#xff0c;很容易会造成我们皮肤的瘙痒&#xff0c;我们大部分时间都在户外&#xff0c;暴露…