摘要
希尔排序是插入排序的改进版,通过增量分组实现元素跨距离移动,大幅减少逐位挪动开销。每趟排序按当前增量将序列分成若干子序列,分别进行插入排序;随后逐步缩小增量,直到增量为1时做最后一次整体插入排序。若增量为1,希尔排序退化为普通插入排序。希尔排序是原地、不稳定的算法,时间复杂度依赖增量序列,通常为O(n¹·³)到O(n²)。使用给定增量序列(如5,3,1)时,直接按序列执行即可,每趟必须涵盖全部元素,且上一趟结果是下一趟的输入。

目录
[一. 直接手写一个例子(可大白话理解)](#一. 直接手写一个例子(可大白话理解))
[二. 官方解释](#二. 官方解释)
一. 直接手写一个例子(可大白话理解)
注意:一开始小白可能不懂"希尔排序"是什么,下面这段文字看看就行了,实在不会,继续往下看,结合结合例题,找个感觉就OK了。
如下图,题目给的条件是增量d一开始为2,即d1=2,那么d2=d1/2=1(这是默认规则,除非题目跟你说了增量序列是多少,那我们就不需要依次除以2自己去求了)。注意以下几点:
- 第一趟:要从第1个元素开始,往后数d1(即2)个元素,一直数,直到没有可数的,这些元素组成第一组;然后再从第2个元素开始,往后数d1(即2)个元素,一直数,直到没有可数的,这些元素组成第二组;......以此类推,直到把所有元素都涵盖掉。
- 第二趟:要从第1个元素开始,往后数d2(即1)个元素,一直数,直到没有可数的,这些元素组成第一组;可见此时只有一组,因为步长是1,直接整个序列属于同一组。
可见两点:
- 我们的每一趟,只是步长不一样,但是都必须涵盖掉所有元素
- 每一组之间,只是往后错开一个元素
- 直到d=1时,就不能继续往下再来一趟了,因为d=1时,一组就可以涵盖掉所有元素
- 可见,如果一上来就令d=1 ,那么此时**"希尔排序"** 就会退化成**"插入排序"**

二. 官方解释
希尔排序(Shell Sort)是一种基于插入排序的改进算法,核心思想是让元素能一次跨越多个位置移动 ,从而减少传统插入排序中大量逐位挪动的开销。它通过选择一个增量序列(如数组长度的一半,再逐次减半),将整个待排序序列按增量分成若干个子序列,分别对每个子序列进行直接插入排序;完成一轮后缩小增量,重复分组排序,直到增量变为1,此时整个序列已基本有序,只需再做一次普通的插入排序即可。这种"预排序"策略使得较小的元素能快速跳到前面,较大的元素快速移到后面,大幅减少了逆序对数量,因此希尔排序的时间复杂度依赖于增量序列的选择,通常在O(n^1.3)到O(n^2)之间,且不需要额外大量内存,属于不稳定的原地排序算法,适合中等规模数据的快速排序场景。
三.例题(仔细看,很有收获)
题目

分析过程

可总结出以下几点:
- 题目给了增量序列 = 5,3,1,此时我们直接用这个就行(即:第一趟步长为5,第二趟步长为3,第三趟步长为1),而不是再除以2手动去求每个步长了。
- 每一趟排序,不管步长是多少,都要涵盖掉所有元素
- 上一趟排序的结果序列,是下一趟排序的开始序列
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~