【算法知识】详解希尔排序算法
前言
已发布:
【算法知识】详解选择冒泡算法
【算法知识】详解选择排序算法
【算法知识】详解插入排序算法
当待插入元素是一个很小(当需求是从小到大排序时,从大到小排序时此处为很大)直接插入排序需要移动较多次数,性能会很差。希尔排序解决了这一问题。
基本思想
希尔排序的基本思想:把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
如果对直接插入排序不了解的朋友,可以看我的这篇文章:
详解直接插入排序算法
例子
给定数组arr为 [ 3 , 6 , 5 , 12 , 1 , 75 , 10 , -3, 0 ] 初始状态见下图:
定义变量 h为增量,初始值为5 。
第一轮根据增量设置成5组,颜色相同的为一组。
对每一组进行直接插入排序得到:
然后 h减半向下取整;
则 h = 3;
第二轮根据增量设置成5组,颜色相同的为一组。
对每一组进行直接插入排序得到:
然后 h减半向下取整;
则 h = 1;
第三轮增量为1,所有序列为一组。
插入排序后得到:
h此时为1,全部有序,完毕。
由例子可知,每次都可以达到组内部分有序,大大减少了插入排序的移动开销。
代码
首先说下步长的选择:步长的选择一般时这样的:
int h = 1;
while(h < arr.length / 2){h = 2 * h + 1;
}
即先把步长设置为1,只要 h 小于数组长度一半(向下取整)就在原基础上乘以2再加上1;
那么,本文的例子中的步长计算为:
初始设为1;
arr.length为9,其一半向下取整为4;
1 < 4;则 h 修正为 h = 1 * 2 + 1 = 3;
3 <4 仍成立,h修正为 h = 3 *2 + 1 = 7 。
本文一开始将 h 选为5,是为了演示方便。
根据步长分组后,进行插入排序的代码为:
for(int i= h ; i< arr.length;i++){value = arr[i];index = i - h;//初始为前一个元素while(index >=0 && value < arr[index]){//需要保证index合法//每当前面的元素比待插入元素大,就向后移动arr[index + h] = arr[index];//不用怕覆盖,因为value保存着待插入的值index -= h;}//当退出循环,表明已经找到了待插入位置,即index + harr[index + h] = value;}
对外层循环进行解释:i 的初始值为 h,即第一个待进行插入排序的元素的索引, i - h即为本组待插入元素的最前面元素的索引。
i++表示下一组待插入元素的索引。
内层循环就是插入排序的代码。
如果对直接插入排序不了解的朋友,可以看我的这篇文章:
详解直接插入排序算法
其他
希尔排序的时间复杂度有很多种说法,证明也比较复杂,本文不过多讨论。
关于稳定性:
在不同的插入排序过程中,相等的元素可能在各自的插入排序中发生移动,最后其前后相对位置会发生改变,所以希尔排序是不稳定的。
往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习在线手册深度学习在线手册AI基础下载(pdf更新到25集)本站qq群1003271085,加入微信群请回复“加群”获取一折本站知识星球优惠券,复制链接直接打开:https://t.zsxq.com/yFQV7am喜欢文章,点个在看
【算法知识】详解希尔排序算法相关推荐
- js排序算法详解-希尔排序
全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-希尔排序 希尔排序,直接上图: 像这个算法看图理解起来并不是很难,就像比赛一样,1-6一组,2-7一组,每差5 ...
- DDA画线算法+代码详解-直线扫描算法之一
#DDA画线算法+代码详解-直线扫描算法之一 本文目录结构如下 1.直线扫描算法简介 2.DDA直线扫描算法 2.1 公式推理 1.求斜率K: 2.当|K| <= 1 时 3.当|K| > ...
- 【数据结构之排序】-详解希尔排序
深入理解希尔排序 希尔排序由来 希尔排序思想(升序举例) 希尔排序实现 希尔排序由来 希尔排序(Shell's Sort)是插入排序的一种又称"缩小增量排序"(Diminishin ...
- 【算法知识】详解选择排序算法
基本思想 选择排序的思想是: 给定一个数组arr,其长度为n; 第一次从 arr[0] 到 arr[n-1] 中选取一个最值(按照需求,可以是最大值,可以是最小值,下同)与a ...
- 数据结构与算法--二进制详解 Python二进制算法详解 史上最详细的二进制讲解 彻底搞懂原码、反码、补码 Python的负数二进制表示形式
阅读目录 原码.反码.补码 机器数 和 真值 原码.反码.补码的基础 Python中负数的处理 负数的补码如何转成十进制 位运算符 和 移位运算符 基本概述 妙用 二进制涉及的算法 原码.反码.补码 ...
- 【python算法系列三】 希尔排序算法
希尔排序,又叫"缩小增量排序",是对插入排序进行优化后产生的一种排序算法.它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增 ...
- 【算法】详解二分查找算法(思路很简单,细节是魔鬼)
我周围的人几乎都认为二分查找很简单,但事实真的如此吗?二分查找真的很简单吗?并不简单.看看 Knuth 大佬(发明 KMP 算法的那位)怎么说的: Although the basic idea of ...
- 十大经典排序算法-希尔排序算法详解
十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...
- 【算法知识】详解直接插入排序算法
前言 已发布: [算法知识]详解选择冒泡算法 [算法知识]详解选择排序算法 在玩扑克牌的时候,我们抽到一张牌的时候,都是将它插入到当前手中牌的合适位置的. 如下图: (上图来自算法导论) 直接插入排序 ...
最新文章
- 微信小程序修改整体背景颜色
- [转]RDLC报表-参数传递及主从报表
- 系统架构设计师视频教程免费下载
- 2019 神策春招 | “数”天下神人,都“据”于此
- MATLAB中unzip出错,node.js里unzip出错的处理
- Spring mvc ContextLoaderListener 原理解析
- boost::container模块实现普通容器的程序
- 关于kafka生产者相关监控指标的理解(未解决)
- 在同一基准下对前端框架进行比较(2019年更新)
- -javaagent:_从javaagent迁移到JVMTI:我们的经验
- 天津科技大学中外合作办学计算机科学怎么样,天津科技大学计算机类(中外合作办学)(计算机科学与技术(信息处理专业2016年在安徽理科高考录取最低分数线...
- STM32中断与事件
- 重访 list comprehension
- 杭州初中计算机老师怎么样,杭州中学两位老师,获得浙江省优质课评比一等奖。学生激动留言,这么多年老师还是这么漂亮!...
- 第一次养狗_如何度过艰难的第一个月
- C++ 打表法计算农历错误数据处理
- href和src的区别
- python 创建和使用字典
- Ubuntu下完全卸载nginx服务器
- 使用STM32输出PWM波形
热门文章
- General texture mapping resources
- Python-语句执行
- Linker Scripts3--简单的链接脚本命令2-Assigning Values to Symbols
- MongoDB基本概念和安装配置
- PS网页设计教程——30个优秀的PS网页设计教程的中文翻译教程
- ASP.NET 开发实践--性能与缓存
- mysql事务未提交读_mysql事务之未提交读Read uncommitted(仅学习)
- 2021-11-13SystemStringBuliding
- 安装rlwrap 的简单方法,亲测好用
- linux限制普通账号使用sftp,CentOS6.2使用SFTP限制帐号SSH连接