希尔排序

思想:

逐步分组进行粗调,最后进行插入排序。

分组的话一开始两个元素之间相隔的距离是总元素数量的一半,然后再变为1半,最后变为1,每一次都是使用插入排序来做的,我排两个元素和一个元素,总比排很多个元素要好。

 

 

代码:

 public static void sort(int[] nums) {
         int d = nums.length;
         while (d > 1) {
             d = d / 2;
             for (int i = 0; i < d; i++) { // 前面的四个数
                 for (int j = i + d; j < nums.length; j += d) { // 前面四个数一一对应的四个数
                     // 下面开始前后比较
                     int temp = nums[j];
                     int k ;
                     for (k = j - d; k >= 0 && nums[k] > temp; k -= d) {
                         nums[k + d] = nums[k]; // 前面的值赋给后面
                    }
                     // 最后k比插入位置少d
                     nums[k + d] = temp;
                }
            }
        }
    }

稳定性:不稳定

空间复杂度:O(1)

时间复杂度:平均是小于O (N^2) 的,看你的d是怎样选的,d选的好的话,可以降到O (n^3/2),或者O (n^4/3)

posted on 2022-04-09 10:47  Love&Share  阅读(30)  评论(0编辑  收藏  举报

导航