算法思想
希尔排序是特殊的插入排序,直接插入排序每次插入前的遍历步长为1,而希尔排序是将待排序列分为若干个子序列,对这些子序列分别进行直接插入排序,当每个子序列长度为1时,再进行一次直接插入排序时,结果一定是有序的。常见的划分子序列的方法有:初始步长(两个子序列相应元素相差的距离)为要排的数的一半,之后每执行一次步长折半。
希尔排序的过程演示如下:
算法复杂度
排序方法 | 时间复杂度 | 空间复杂度 | 稳定性 | 复杂性 | ||
平均情况 | 最坏情况 | 最好情况 | ||||
Shell 排序 | O(n3/2) | O(n^2) | O(n) | O(1) | 不稳定 | 较复杂 |
参考代码
void Shell_sort(int *a, int len) {
int i, j, temp, gap;
for (gap = len / 2; gap >= 1; gap /= 2) {
for (i = gap; i < len; i += gap) {
temp = a[i];
j = i - gap;
while (j >= 0 && a[j] > temp) {
a[j + gap] = a[j];
j -= gap;
}
a[j + gap] = temp;
}
}
}