希尔排序

一:什么是希尔排序

希尔排序基于插入排序,并添加了新特性,提高效率.
图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;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值