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

 

看个动画先,急什么啊 笑死。。。。希尔这孩子打小就聪明 我笑了。

这玩意就是直接插入排序的优化版本,希尔这孩子 太调皮了8


image

换句话讲:

  1. 一开始我们选一个d,这个d是 “长度 / 2 ”而来的【也可以不是/2 但/2用的多】
  2. 然后以d为间距,选取距离 d 距的元素,然后进行划分为一组一组,进行直接插入排序。
  3. 二轮循环:d /= 2,变为之前的一半,然后再次划分,重复第2步,
  4. 直到d = 1,那时候序列基本是有序的了,在进行一趟直接插入排序,那就完成了
  5. 注意: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

請看下圖:
image

空间复杂度

从空间来看, 希尔排序和前面两种排序方法一样,也只需要一个辅助空间r[O], 空间复杂度
为0(1)

穩定性

不稳定

  1. 例:
    image
posted @   咸瑜  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2021-10-02 SPringBoot 集成 热部署
点击右上角即可分享
微信分享提示