/*
希尔排序:
直接插入排序的改进版本,初始时会有一个排序增量,通常为数组长度的一半,按此增量进行直接插入排序,
每轮操作后将增量/2,
直至增量为一,此时相当于进行一次原始直接插入排序
*/
#include <stdio.h>
#include <stdlib.h>
void shellSort(int *arr, int len) {
int d = len / 2;
while (d >= 1) {
for (int i = 0; i < d; i++) {//对于d增量内的每一个元素直接插入排序
for (int j = i + d; j < len; j += d) {//按增量寻找是否存在逆序元素
if (arr[j] < arr[j - d]) {//找到了逆序元素
int numK = arr[j], k;//将该值暂存于numK
for (k = j; numK < arr[k - d]; k -= d) {//按d增量向后移元素,判断依据是前面的元素都大于找到的逆序元素
arr[k] = arr[k - d];
}
arr[k] = numK;//最后将逆序元素归位,而位置就是k
}
}
}
d = d / 2;
}
}
int main() {
int arr[] = { 9,3,4,10,2,5,7,12,10,15 };
shellSort(arr, 10);
for (int i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}