java希尔排序

希尔排序详解:算法实现与优化
本文介绍了希尔排序的原理,通过实例展示了如何使用Knuth序列进行数组的排序,包括了核心代码、间隔选择策略和交换操作。深入理解并实践了这种高效的插入排序改进算法。
  //希尔排序
    public static void main(String[] args) {
        int[] arr = {9, 6, 11, 3, 5, 12, 8, 7, 10, 15, 14, 4, 1, 13, 2};

        sort(arr);

        print(arr);

    }

    public static void sort(int[] arr){
        //Knuth序列  h = 1   h = h * 3 + 1
        int h = 1;
        while (h < arr.length / 3){
            h = 3 * h + 1;
        }
        //gap为希尔的间隔, 最优为Knuth, 也可每次取1/2
        //希尔排序 按间隔排 先排间隔 依次缩小间隔
        for (int gap = h ; gap > 0 ; gap = (gap - 1) / 3){
            for (int i = gap ; i < arr.length ; i ++){
                for (int j = i ; j > gap - 1 ; j = j - gap){
                    if (arr[j] < arr[j - gap]){
                        swap(arr, j, j - gap);
                    }
                }
            }
        }
    }

    static void swap(int [] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }


    static void print(int [] arr){
        for (int i = 0 ; i < arr.length ; i ++){
            System.out.println(arr[i]);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值