数据结构-希尔排序 【插入】

看个动画先,急什么啊 笑死。。。。希尔这孩子打小就聪明 我笑了。
这玩意就是直接插入排序的优化版本,希尔这孩子 太调皮了8
换句话讲:
- 一开始我们选一个d,这个d是 “长度 / 2 ”而来的【也可以不是/2 但/2用的多】
- 然后以d为间距,选取距离 d 距的元素,然后进行划分为一组一组,进行直接插入排序。
- 二轮循环:d /= 2,变为之前的一半,然后再次划分,重复第2步,
- 直到d = 1,那时候序列基本是有序的了,在进行一趟直接插入排序,那就完成了
- 注意:r[O]只是暂存单元, 不是哨兵。当j<=0 时, 插入位置巳找到。
其实就是这个d在作祟啊,如果d = 1,那么!他就是普通的一个插入排序,
“希尔这孩子 哎”
代码实现:[书上的貌似是预留了一个 [0] 作为对比临时值的 ]
#include <stdio.h> //希尔排序 咸瑜 void ShellSort(int A[], int n) { int d, i, j; //A[0]为暂存单元 for (d = n / 2; d >= 1; d = d / 2) //步长递减(看题目要求,一般是1/2 for (i = d + 1; i <= n; ++i) //思考:为什么 "i = d + 1" if (A[i] < A[i - d]) { A[0] = A[i]; for (j = i - d; j > 0 && A[0] < A[j]; j -= d) A[j + d] = A[j]; //记录后移,查找插入的位置 A[j + d] = A[0]; //插入 } } int main() { int i, a[5] = {0, 20, 3, 1, 2}; ShellSort(a, 4); for (i = 1; i < 5; i++) { printf(" %d", a[i]); } return 0; }
代码考察不太高,就是代码考的少,一般靠你过程。
时间复杂度
无法用数学说明这个玩意的时间复杂度,最坏其实就是 d = 1,那么就是直接插入排序,就是:O(n^2), 最好(当 n 在某个特定范围内):当 n 趋向于 oo 时,可减少到 n(log2n)^2
請看下圖:
空间复杂度
从空间来看, 希尔排序和前面两种排序方法一样,也只需要一个辅助空间r[O], 空间复杂度
为0(1)
穩定性
不稳定
- 例:
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/16748832.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2021-10-02 SPringBoot 集成 热部署