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

希尔排序,详细解析(附图解)

1.希尔排序思路

希尔排序是一种基于插入排序的算法,通过将原始数据分成若干个子序列,然后对子序列进行插入排序,逐渐减小子序列的间隔,最后对整个序列进行一次插入排序。
 

1.分组直接插入排序,目标接近有序-----------gap>1

2.直接插入排序,目标有序-----------------------gap=1

2.分组排序思路分析

假设固定gap=3,那么以下数组可以分为三组

每一组都使用用直接插入排序,使数据有序

最后三组都排完后数组变成了:0,2,1,4,3,6,5,7,8,此时的结果接近有序

此时只需要再调用一次插入排序,即可让整个数组变得有序。

下面我们来实现一下这个

2.1思路代码

void ShellSort(int* a, int n)
{int gap = 3;for (int j = 0; j < gap; j++){for (int i = j; i < n - gap; i += gap){int end = i;int tmp = a[end + gap];while (end >= 0){if (a[end] > tmp){a[end + gap] = a[end];end -= gap;}else{break;}}a[end + gap] = tmp;}for (int i = 0; i < n; i++){printf("%d ", a[i]);}printf("\n");}
}

在每一组排序后都打印一下来观察

2.2结果显示

3.gap的设定

当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
 

当我们不再固定gap而是让他变化时,如下图gap=gap/2;

3.1动图演示

一般现在认为gap=gap/3+1较为合适,我们以此来实现一下代码

3.2最终代码实现

这里省去了一层for循环,把原本一组一组交换变为了组之间交替交换,时间复杂度没有改变。

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

4.时间复杂度

记忆:O(N^1.3)

比O(N*logN)大,比O(N^2)小

希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • yolov8旋转框+关键点检测
  • XSS GAME
  • 记录一个变量溢出的bug
  • Hive3:常用查询语句整理
  • gitlab
  • 知识竞赛答题设备及答题方式有哪些
  • 什么是应用交付控制器(ADC)
  • 【ML+DL 基础知识】信息瓶颈
  • Mybatis(面试篇)
  • git fetch和git pull的区别
  • LeetCode 算法:数组中的第K个最大元素 c++
  • 网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
  • 数智化底座:企业迈向智能未来的关键
  • VMware vSphere Replication 虚拟机备份及迁移实践
  • 美国一男子伪造死亡逃避抚养义务,获刑六年
  • 【面试系列】之二:关于js原型
  • emacs初体验
  • exif信息对照
  • HTML-表单
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • js
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • maya建模与骨骼动画快速实现人工鱼
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue ES6 Jade Scss Webpack Gulp
  • 大主子表关联的性能优化方法
  • 二维平面内的碰撞检测【一】
  • 服务器之间,相同帐号,实现免密钥登录
  • 如何选择开源的机器学习框架?
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 微信小程序填坑清单
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 怎么将电脑中的声音录制成WAV格式
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • nb
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #stm32驱动外设模块总结w5500模块
  • $jQuery 重写Alert样式方法
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)Docker基本介绍
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .NET大文件上传知识整理
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [《百万宝贝》观后]To be or not to be?
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [AIGC] SpringBoot的自动配置解析
  • [android] 看博客学习hashCode()和equals()