排序算法02-希尔排序

希尔排序的名称来源于它的提出者希尔,说点题外话,希尔这家伙运气还是可以的,这是唯一一个以人名命名的排序算法(仅对于常规的八大排序算法);

希尔排序的本质是对于插入排序的改进,插入排序可以理解为增量为1的排序,因为执行N次,都使得数组arr[0]、arr[1]、。。。arr[N-1]完成排序,可以看出增量为1;而希尔排序是采用的缩减增量排序,在希尔排序中增量的初始值为arr.length/2,然后根据增量进行分组,对分组之后的每一组数据进行插入排序,排序完毕之后令增量减半,直至增量为1,此时希尔排序完毕。

希尔排序的算法复杂度为O(n^{3/2}),是第一批打破二次屏障的排序算法之一。

鉴于作者的文笔与表达能力有限,下面引入一张图片,图片来源于https://www.cnblogs.com/chengxiao/p/6104371.html

实现希尔排序的简单程序如下:

    public static int[] shellSort(int[] arr)
    {
        int j;
        for (int gap = arr.length / 2; gap >= 1; gap /= 2)
            for (int i = gap; i < arr.length; i++)
            {
                int temp = arr[i];
                for (j = i; j >= gap && temp < arr[j - gap]; j -= gap)
                    arr[j] = arr[j - gap];
                arr[j] = temp;
            }
        return arr;
    }

猜你喜欢

转载自blog.csdn.net/qq_38258310/article/details/82415281