#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;
}
原文:https://www.cnblogs.com/sqdtss/p/10738686.html