希尔排序详解

1.希尔排序的产生

希尔排序是基于插入排序的,插入排序步长为1的,而插入排序的步长是计算出来的。(学习希尔排序之前需要了解插入排序)。

2.插入排序的缺陷

步长为1的插入排序,必须得移动多次,举个栗子,假如一个很小的数据在考右侧的位置上,那么要讲该数据排序到正确的位置上,则所有中间数据都需要向右移动一次。

3.希尔排序的优点

希尔排序通过加大插入排序中元素之间的间隔(步长),并对这些间隔的元素进行排序,从而使得数据可以大幅度的移动,当完成该间隔的排序后,希尔排序会减少数据的间隔再进行排序,依次进行下去。

4.步长的计算

步长h的初始值为1,通过公式:h=3*h+1来循环计算,知道该间隔大于数组的大小时停止。
,h取值为(1,4,13,40…)

5.步长减少计算

通过公式:h=(h-1)/3

6.讲解代码

    public static void sort(long[] arr) {
        //初始化一个间隔
        int h = 1;
        //计算最大间隔
        while(h < arr.length / 3) {
            h = h * 3 + 1;
        }

        while(h > 0) {
            //进行插入排序
            long tmp = 0;
            for(int i = h; i < arr.length; i++) {
                tmp = arr[i];
                int j = i;
                while(j > h - 1 && arr[j - h] >= tmp) {
                    arr[j] = arr[j - h];
                    j -= h;
                }
                arr[j] = tmp;
            }
            //减小间隔
            h = (h - 1) / 3;
        }
    }
}

你可能感兴趣的:(数据结构与算法)