希尔排序是什么?一文详解(附例题)

摘要

希尔排序是插入排序的改进版,通过增量分组实现元素跨距离移动,大幅减少逐位挪动开销。每趟排序按当前增量将序列分成若干子序列,分别进行插入排序;随后逐步缩小增量,直到增量为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手动去求每个步长了。
  • 每一趟排序,不管步长是多少,都要涵盖掉所有元素
  • 上一趟排序的结果序列,是下一趟排序的开始序列

以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~

相关推荐
HZ·湘怡2 个月前
排序算法之希尔排序(2)--菜鸟先飞
数据结构·算法·排序算法·希尔排序
Dlrb12113 个月前
数据结构-排序算法
数据结构·算法·排序算法·插入排序·堆排序·希尔排序·快速排序
冉佳驹9 个月前
数据结构 ——— 八大排序算法的思想及其实现
c语言·数据结构·排序算法·归并排序·希尔排序·快速排序·计数排序
派大星爱吃猫10 个月前
希尔排序详解
算法·排序算法·希尔排序
_OP_CHEN1 年前
数据结构(C语言篇):(十六)插入排序
c语言·数据结构·排序算法·学习笔记·插入排序·希尔排序·直接插入排序
hzhzh~1 年前
【C++】神秘-希尔排序
c++·希尔排序·排序·sort
int型码农1 年前
数据结构第八章(一) 插入排序
c语言·数据结构·算法·排序算法·希尔排序
D_aniel_1 年前
排序算法-希尔排序
java·算法·排序算法·希尔排序
云边有个稻草人1 年前
【数据结构初阶第十八节】八大排序系列(上篇)—[详细动态图解+代码解析]
算法·冒泡排序·堆排序·希尔排序·八大排序·快排·直接插入排序