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

C语言希尔排序详解!!!速过

目录

希尔排序是什么?

关于时间复杂度

希尔排序的源代码

希尔排序源代码的详解


希尔排序是什么?

之前我们说了三个排序(插入排序,选择排序,冒泡排序)有需要的铁铁可以去看看之前的讲解。

但因为之前的排序时间复杂度都是n^2.接下来介绍的希尔排序是一个时间优于前面三种排序的算法

 由上图我们看到排序被分为了许多组(不同的颜色),这就是希尔排序的

第一步:分组小排(自己取得名)

这一阶段呢就是要将每个组进行一个排序让其每个组都是有序的,这样形成一个散乱但比之前更有序的结果,可以从图中第一轮结果看出。

但我们发现好像这也没有序啊,当然了,如果这么简单那这个时间负责度就是n了,所以就需要下一步了。

第二步:改间隔,重新排。

由于第一步的开荒,数组比刚开始有序的多但还是模糊,接下来如果我们把间隙改小,那每一个小组的数字就会增多,但又由于之前第一组的原因其实有些数据已经其实已经到了属于自己的位置,那接下来就会减少损耗(不用交换数据)。就这样到gap==1(每组的间隔),就有序了

总的希尔排序,就是先分组,在排序,每次使模糊的答案清晰一点(每一次的损耗都会减小),最终当gap == 1时,只需轻轻擦拭即可得出答案。

关于时间复杂度

因为gap的原因所以希尔排序是不稳定的。 

希尔排序的源代码

void ShellSort(int* a, int n)
{int gap = n;while(gap>1){gap = gap / 2;for (int i = 0; i < n - gap; i++){int end = i;int tmp = a[end + gap];while (end >= 0){if (tmp < a[end]){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}}
}

希尔排序源代码的详解

首先传入一个数组a,和数组个数n。

gap == n,为什么要gap > 1呢?因为当gap一直除以2,最后一组的gap 一定是2。

因为之前介绍到,到gap == 1时排完这时候数组就是有序的了。所以当 gap == 2 / 2 == 1时。最后一趟走完就可以走出循环了。

相关文章:

  • redis的缓存穿透,缓存并发,缓存雪崩,缓存问题及解决方案
  • 【MySQL】事务的一致性究竟怎么理解?
  • Spring Boot项目打包及依赖管理-瘦身
  • css中选择器的优先级
  • flink operator 1.7 更换日志框架log4j 到logback
  • 最近火的一键穿衣AI,这款服装设计软件也不赖
  • 【动态规划专栏】专题二:路径问题--------6.地下城游戏
  • 2024-02-20(数位DP)
  • RuntimeError: CUDA out of memory.【多种场景下的解决方案】
  • Delphi语言教程
  • Uipath 读取Word模板实现录用通知书PDF批量生成
  • CSS篇--transform
  • 基于Java SSM框架实现老年人食谱管理系统项目【项目源码+论文说明】
  • 微众银行:始于数字原生,立于普惠金融
  • node+vue3+mysql前后分离开发范式——实现对数据库表的增删改查
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 《网管员必读——网络组建》(第2版)电子课件下载
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • fetch 从初识到应用
  • Quartz初级教程
  • react 代码优化(一) ——事件处理
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue数据传递--我有特殊的实现技巧
  • webpack+react项目初体验——记录我的webpack环境配置
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 试着探索高并发下的系统架构面貌
  • 微服务框架lagom
  • 移动端 h5开发相关内容总结(三)
  • 湖北分布式智能数据采集方法有哪些?
  • 组复制官方翻译九、Group Replication Technical Details
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (一)Neo4j下载安装以及初次使用
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net MVC + EF搭建学生管理系统
  • .Net7 环境安装配置
  • .net网站发布-允许更新此预编译站点
  • @media screen 针对不同移动设备
  • @Repository 注解
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [Android]常见的数据传递方式
  • [BZOJ 3282] Tree 【LCT】
  • [bzoj1324]Exca王者之剑_最小割
  • [excel与dict] python 读取excel内容并放入字典、将字典内容写入 excel文件
  • [FC][常见Mapper IRQ研究]
  • [G-CS-MR.PS02] 機巧之形2: Ruler Circle
  • [GN] Vue3快速上手1
  • [ISITDTU 2019]EasyPHP
  • [leetcode] Longest Palindromic Substring
  • [LeetCode]Pow(x,n)
  • [na]wac无线控制器集中转发部署的几种情况
  • [Neural Network] {Université de Sherbrooke} L2.9 Param Initialization
  • [one_demo_8]十进制转二进制