希尔排序详解

本文深入探讨了希尔排序的工作原理,从其产生的背景出发,对比插入排序的局限性,介绍了希尔排序如何通过调整元素间的间隔实现更高效的排序过程。文章还详细说明了步长计算的方法,并附带了一个具体的Java实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值