#include <stdio.h>
#include "tool.h"
/*
简单插入排序算法:
1.把待排序序列按相等的间隔分成多个子序列,然后分别子序列进行排序
2.开始间隔较大,在每轮排序后,逐步缩小间隔,直到间隔为1
最差时间复杂度:O(N^(3/2))
*/
void shellSort(int a[], int len) {
int s, D, P, i;
int sw[] = {41,19, 5,2,1,0 };
for (s = 0; sw[s] >= len; s++)
;//初始增量不能超过待排序序列长度
for (D = sw[s]; D > 0; D=sw[++s]) {//每个间隔执行一轮排序,直到间隔为1
//执行插入排序
for (P = D; P < len; P++) {
int tmp = a[P];
for (i = P; i >= D && a[i - D] > tmp; i -= D) {
a[i] = a[i - D];
}
a[i] = tmp;
}
}
}
int main() {
int a[10] = { 9,1,8,5,7,6,4,3,10,2 };
int len = sizeof(a) / sizeof(a[0]);
printf("排序前: ");
printfArray(a, len);
shellSort(a, len);
printf("排序后: ");
printfArray(a, len);
return 0;
}
来源:oschina
链接:https://my.oschina.net/u/568675/blog/4331563