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