#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