【希尔排序模板】

系列文章目录

提示: 以下是其他排序算法的链接🔗

十大排序算法模板,点击跳转

文章目录

  • 系列文章目录
  • 希尔排序是什么?

希尔排序是什么?

希尔排序(Shell Sort)是一种基于插入排序的排序算法,也被称为缩小增量排序。希尔排序通过将待排序的元素分组,然后逐步缩小增量,对每个分组进行插入排序,最终完成整个序列的排序。

希尔排序的步骤如下:

  1. 首先,选择一个增量序列(通常是递减的),用于确定分组的间隔。常用的增量序列有希尔增量序列(n/2, n/4, n/8, …)和Hibbard增量序列(1, 3, 7, 15, …)等。
  2. 根据选定的增量,将待排序的元素分成多个分组,每个分组包含相隔增量个位置的元素。
  3. 对每个分组进行插入排序,即将每个分组中的元素按照插入排序的方式进行排序。(也就是说希尔排序是插入排序的优化版本
  4. 缩小增量,重复步骤2和步骤3,直到增量为1。
  5. 最后,进行一次增量为1的插入排序,完成整个序列的排序。

希尔排序的关键在于选择合适的增量序列。较大的增量可以快速减少序列中的逆序对数量,从而提高排序效率。而较小的增量可以保证序列在最后一轮排序时已经基本有序,减少插入排序的比较和交换次数。

希尔排序的时间复杂度取决于增量序列的选择,最坏情况下为O(n^2),但在平均情况下可以达到O(n log n)的性能。

代码模板(示例):

力扣912排序数组练习

class Solution {
    public int[] sortArray(int[] nums) {
        shellSort(nums);
        return nums;
    }

     /**
     * 希尔排序,是对插入排序的优化(即先让部分元素有序,将大数和小数分布与左右)
     * 不稳定
     * O(NlogN)
     */
    public static void shellSort(int[] arr) {
        int n = arr.length;
        for (int gap = n / 2; gap > 0; gap /= 2) {// 步长可以自定义,一般是 /2
            // 将插入排序的代码中的 1 替换为 gap 即可
            for (int i = gap; i < n; i++) {
                int index = i - gap;
                int indexVal = arr[i];
                while (index >= 0 && indexVal < arr[index]) {
                    arr[index + gap] = arr[index];
                    index -= gap;
                }
                arr[index + gap] = indexVal;
            }
        }
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值