希尔排序(Java代码)

简介:百度说:希尔排序(Shell’s Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

一、核心思想

希尔排序核心思想就是:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。(希尔排序相当与普通插入排序的升级版,只不过是多了增量分组的过程)(如下图实例)

二、实例

在这里插入图片描述

图片截至:https://www.bilibili.com/video/BV1B4411H76f?p=63&vd_source=a324c81d0edc7a9cbb08964c090285e4

三、代码实现(java)

public class Sort {
    /**
     * 希尔排序(位移法)(插入排序的一种更高效的方法)
     * @param nums
     * @return
     */
    public int[] shellSort(int[] nums) {
        //数组首先分成nums.length / 2 组
        int t = nums.length / 2;
        //分组每次减少两倍,直到变为一组
        while (t >= 1) {
            //处理每一组
            for (int i = t; i < nums.length; i++) {
                //当前分组待插入数
                int insertNum = nums[i];
                //当前分组待插入数前一个数下标
                int insertIndex = i - t;
                while (insertIndex >= 0 && nums[insertIndex] > insertNum) {
                    //当前分组待插入数前一个数大于待插入数,,待插入数在待插入数前一个数前面,待插入数前一个数向后移动一位。
                    nums[insertIndex + t] = nums[insertIndex];
                    //当前分组待插入数再与前前一个数比较,循环往复
                    insertIndex -= t;
                }
                //当前分组循环结束,(1)要么是insertIndex == 负数    及这个数是有序数组中最小的,他就是当前分组数组第一个数咯
                //(2)要么是nums[insertIndex] <= insertNum    及待插入数前一个数比待插入数小,那么insertIndex + t就是这个数该在的下标
                nums[insertIndex + t] = insertNum;
            }
            t = t / 2;
        }
        return nums;
    }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值