希尔排序

久未见 提交于 2020-01-27 20:21:54

一:什么是希尔排序

希尔排序基于插入排序,并添加了新特性,提高效率.
图1

二:插入排序的缺陷

加入一个很小的数值排在最末尾,如果需要正确排序,则需要将所有的数据都向右移动才可以将小的数据排到前面
缺陷: 移动次数太多

三:希尔排序的优点

加大排序中元素之间的间隔,对这些间隔的元素进行插入排序,使数据可以大幅度移动,当完成间隔排序后,希尔排序会减少间隔之间的元素再进行排序,依次进行下去

四:间隔计算

间隔h的初始值为1,通过 h = 3*h + 1 来计算循环,直到该间隔大于数组的大小时停止.最大间隔为不大于数组大小的最大值

五:间隔减少

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

六:代码实现

public class ShellSort {
    public static void main(String[] args) {
        long[] arr = {3,4,7,2,1,0,8};
        sort(arr);
        System.out.println(Arrays.toString(arr));
    }

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!