希尔排序

#include <stdio.h>

// 希尔排序
void shell_sort(int sz[], int len)
{
    // 对顺序表做希尔排序,本算法和直接插入排序相比,做了一下修改:
    //1.前后记录位置的增量是dk,不是1
    //2.sz[0]只是暂存单元,不是哨兵
    //3.希尔排序是不稳定的排序(当相同的关键字被划分到不同的子表中时,可能会改变他们的相对次序)
    //4.空间复杂度:仅使用了常数个辅助单元,空间复杂度为O(1)
    //5.时间复杂度:希尔排序的时间复杂度依赖于增量序列的函数,这涉及数学上还未解决的难题,所以其分析
    //比较困难,当n在某个特定范围时,希尔排序的时间复杂度约为O(n^1.3),在最坏情况下希尔排序的时间复杂度有为O(n^2)
    for (int dk = len >> 1; dk > 0; dk /= 2)
    {
        for (int i = dk + 1; i < len + 1; i++)
        {
            if (sz[i] < sz[i - dk])
            {
                // 位置0为暂存单元
                sz[0] = sz[i];
                int j;
                for (j = i - dk; sz[j] > sz[0] && j > 0; j -= dk)
                {
                    sz[j + dk] = sz[j];
                }
                sz[j+dk] = sz[0];
            }
        }
    }
}
int main()
{
    // 0位置不作为哨兵※,只是暂存单元
    int a[] = {0, 5, 10, 8, 100, 50, -10, 60};
    shell_sort(a, 7); // 7为数组实际长度
    // 输出排序结果
    for (int i = 1; i < 8; i++)
    {
        printf("%d%c", a[i], i == 7 ? '\n' : ' ');
    }
    return 0;
}

  

posted @ 2019-04-19 20:47  sqdtss  阅读(104)  评论(0编辑  收藏  举报