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

 

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

这玩意就是直接插入排序的优化版本,希尔这孩子 太调皮了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 @ 2022-10-02 15:34  咸瑜  阅读(33)  评论(0)    收藏  举报