news 2026/5/8 4:01:57

希尔排序详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
希尔排序详解

目录

一、从直接插入排序到希尔排序的优化思想

📌 什么是局部有序?

二、核心优化思想:预排序

三、gap分组思想

📌 基本思想:

📌 示例过程

gap = 4

gap = 2

gap = 1

四、希尔排序代码实现(优化版本)

五、代码核心思想解析

📌 1. gap控制分组

📌 2. 分组处理

📌 3. 组内插入排序

六、希尔排序时间复杂度分析

📌 常见结论(经验统计)

✔ 平均时间复杂度O(n^1.3)

✔ 最坏情况O(n^2)

✔ 空间复杂度O(1)

七、算法本质总结


一、从直接插入排序到希尔排序的优化思想

在学习直接插入排序时我们知道,它在数据基本有序的情况下效率很高,但在完全无序甚至逆序的情况下性能较差,其时间复杂度通常为:O(n^2)

但如果数据越接近“局部有序”,插入排序的效率会显著提升,甚至接近:O(n)


📌 什么是局部有序?

所谓局部有序,指的是:

  • 小的元素大致靠前
  • 大的元素大致靠后
  • 中间元素分布相对合理

例如一个数组虽然整体无序,但如果:

  • 前半部分整体较小
  • 后半部分整体较大

那么它就比完全逆序更接近有序状态。


二、核心优化思想:预排序

既然插入排序对“接近有序”的数据效率更高,那么我们可以:

在正式排序之前,先让数据“变得更有序”

这个过程就叫:

预排序(Pre-Sorting)


三、gap分组思想

希尔排序的核心是引入一个间隔变量gap

📌 基本思想:

  • 将数组按 gap 分成若干组
  • 每组内部进行插入排序
  • 不断缩小 gap
  • 最终 gap = 1 时完成整体排序

📌 示例过程

假设初始数组:

[15, 7, 3, 11, 1, 9, 5, 13]

gap = 4

分组:

  • (15,1)
  • (7,9)
  • (3,5)
  • (11,13)

组内排序后:

[1, 7, 3, 11, 15, 9, 5, 13]

gap = 2

分组:

  • (1,3,15,5)
  • (7,11,9,13)

进一步接近有序


gap = 1

直接插入排序完成最终排序

希尔排序动图:


四、希尔排序代码实现(优化版本)

下面是基于“分组插入排序思想”的实现:

void ShellSort(int* a, int n) { int gap = n; while (gap > 1) { // gap递减策略(保证最终为1) gap = gap / 3 + 1; // 对每一组分别进行插入排序 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 (tmp < a[end]) { a[end + gap] = a[end]; end -= gap; } else { break; } } a[end + gap] = tmp; } } } }

五、代码核心思想解析

📌 1. gap控制分组

gap = gap / 3 + 1;

作用:

  • 逐步缩小分组规模
  • 最终一定收敛到 gap = 1
  • 保证最后进行一次完整插入排序

📌 2. 分组处理

for (int j = 0; j < gap; j++)

含义:

将数组划分为 gap 个子序列

例如 gap = 4:

0,4,8,... 1,5,9,... 2,6,10,... 3,7,11,...

📌 3. 组内插入排序

for (int i = j; i < n - gap; i += gap)

在同一组内按间隔 gap 进行插入排序


六、希尔排序时间复杂度分析

希尔排序的时间复杂度与 gap 序列密切相关,目前尚无统一精确结论。


📌 常见结论(经验统计)

✔ 平均时间复杂度O(n^1.3)

✔ 最坏情况O(n^2)

✔ 空间复杂度O(1)

七、算法本质总结

希尔排序可以总结为一句话:

通过 gap 分组不断优化数据结构,使插入排序在接近有序的数据上运行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/8 4:00:27

Puya PY32F030开发板:低成本Arm Cortex-M0+嵌入式开发方案

1. 项目概述&#xff1a;Puya PY32F030开发板核心特性解析在嵌入式开发领域&#xff0c;寻找性价比高的MCU开发板一直是工程师们的刚需。最近一款售价仅2美元的Puya PY32F030核心板引起了我的注意——它搭载了基于Arm Cortex-M0内核的PY32F030K28T6微控制器&#xff0c;主频48M…

作者头像 李华
网站建设 2026/5/8 3:57:28

李飞飞做AI游戏,拿了4个亿

Jay 发自 凹非寺量子位 | 公众号 QbitAI 李飞飞又拿到钱了。5600万美元。 不是做世界模型的World Labs&#xff0c;是她联创的一家AI游戏公司&#xff0c;叫Astrocade。 你可能没听过这个名字。 我第一反应也是&#xff0c;等等&#xff0c;飞飞老师什么时候还搞了个游戏公司&a…

作者头像 李华
网站建设 2026/5/8 3:56:50

Hotkey Detective:Windows热键冲突定位的完整解决方案

Hotkey Detective&#xff1a;Windows热键冲突定位的完整解决方案 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾…

作者头像 李华
网站建设 2026/5/8 3:48:40

OpenClaw多智能体飞书集成指南:从零部署AI助手团队

1. 项目概述&#xff1a;一个为新手设计的OpenClaw多智能体向导如果你刚接触OpenClaw&#xff0c;或者对“多智能体”这个概念感到既兴奋又有点无从下手&#xff0c;那你来对地方了。我最近在折腾一个叫openclaw-multi-agent-wizard的开源技能项目&#xff0c;它本质上是一个“…

作者头像 李华