news 2026/5/1 8:38:51

-希尔排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
-希尔排序

并非希儿排序()

其实是分组的插入排序,通过分组让元素实现跳跃式移动,减少逆序对数量。

一、算法步骤

1.确定增量序列(Gap Sequence)
  • 选择递减的增量序列:gap₁ > gap₂ > ... > gapₖ = 1

  • 常用增量序列:

    • Shell原始序列:gap = n/2, n/4, ..., 1

    • Hibbard序列:2ᵏ - 1(1, 3, 7, 15, ...)

    • Knuth序列:3k + 1(1, 4, 13, 40, ...)

    • Sedgewick序列:更复杂的优化序列

2.分组插入排序

对于每个增量gap:

  • 将数组分为gap个子序列

  • 每个子序列由相隔gap的元素组成

  • 对每个子序列进行插入排序

3.逐步缩小增量
  • 每次减少gap,重复分组排序

  • 直到gap = 1,执行最后一次标准的插入排序

代码:

class Solution { public: vector<int> sortArray(vector<int>& nums) { int n = nums.size(); for(int gap = n >> 1; gap; gap >>= 1){ for(int i = gap;i < n; i++){ int j = i - gap; int x = nums[i]; while(j >= 0 && x < nums[j]){ nums[j + gap] = nums[j]; j -= gap; } nums[j + gap] = x; } } return nums; } };

二、所用到的思想

希尔排序虽然不是典型的分治算法(如归并、快排),但它巧妙地运用了分治的核心思想:

1.分解(Divide)

for(int gap = n >> 1; gap; gap >>= 1)
  • 分解方式:按照gap值将原数组分解成多个子序列

  • 分解粒度:从n/2开始,每次减半,直到1

  • 子序列特点

    • gap=4时:分解为4个子序列

      • 子序列1:nums[0], nums[4], nums[8], ...

      • 子序列2:nums[1], nums[5], nums[9], ...

      • 子序列3:nums[2], nums[6], nums[10], ...

      • 子序列4:nums[3], nums[7], nums[11], ...

    • 每个子序列元素间隔为gap

2.解决(Conquer)

for(int i = gap; i < n; i++) { int j = i - gap; int x = nums[i]; while(j >= 0 && x < nums[j]) { nums[j + gap] = nums[j]; j -= gap; } nums[j + gap] = x; }
  • 独立解决:对每个子序列独立进行插入排序

  • 局部有序:每个子序列内部变得有序

  • 关键特性:子序列之间不互相干扰

    • 当处理nums[i]时,只与同子序列的前一个元素nums[i-gap]比较

    • 子序列之间的元素不直接比较

3.合并(Combine)

希尔排序的"合并"是隐式的

  • 无需显式合并:因为排序是原地进行的

  • 渐进合并:随着gap减小,子序列逐渐融合

  • 最终合并:当gap=1时,所有元素在同一个子序列中,完成最终排序。

三、希尔排序分治思想的优势

1.空间效率

  • 原地排序,不需要归并排序的额外数组

  • 空间复杂度O(1)

2.时间效率

  • 早期的大gap快速消除远处逆序对

  • 后期的小gap精细调整局部顺序

  • 比直接对整个数组做插入排序高效得多

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 12:06:56

基于Java的安全生产视频监控智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ?安全生产视频监控智慧管理系统旨在通过先进的技术手段&#xff0c;提升企业安全管理效率与水平。该系统摒弃了传统的单一摄像头监控模式&#xff0c;引入会员、设备及事件管理等多层次功能模块&#xff0c;提供全方位的安全保障服务。相比以…

作者头像 李华
网站建设 2026/4/27 16:22:34

Flink源码阅读:如何生成StreamGraph

Flink 中有四种执行图&#xff0c;分别是 StreamGraph、JobGraph、ExecutionGraph 和 Physical Graph。今天我们来看下我们编写的 Flink 程序代码是如何生成 StreamGraph 的。 在开始读代码之前&#xff0c;我们先来简单介绍一下四种图之间的关系和区别。StreamGraph 是根据用户…

作者头像 李华
网站建设 2026/4/28 19:41:30

事务操作流程

1.开启事务&#xff1a;明确事物的起始点&#xff08;begin或者start transaction&#xff09;2.执行操作&#xff1a;执行SQL语句3.判断结果&#xff1a;若操作都执行成功&#xff0c;提交事务&#xff0c;修改生成若任意操作失败&#xff0c;回滚事务&#xff0c;撤销所有已经…

作者头像 李华
网站建设 2026/5/1 8:17:27

打开软件出现找不到vcomp140.dll文件 无法运行的情况 下载修复解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/5/1 5:03:30

汇编语言全接触-27.工具提示控件

我们将学习工具提示控件:它是什么如何创建和使用.下载例子理论:工具提示是当鼠标在某特定区域上停留时显示的一个矩形窗口.工具提示窗口包含一些编程者想要显示的文本.在这点上,工具提示同状态栏的作用是一样的,所不同的是工具提示当单击或者远离指定区域的时候就会消逝,你可能…

作者头像 李华
网站建设 2026/4/20 12:48:43

测试左移:构建软件质量的早期防线

在快速迭代的现代软件开发周期中&#xff0c;缺陷发现的时机直接影响项目成本、发布节奏与最终用户体验。传统软件测试模式中&#xff0c;测试活动往往集中于开发后期&#xff0c;导致缺陷修复成本高昂、返工风险加剧。测试左移作为一种前瞻性质量保障策略&#xff0c;通过将测…

作者头像 李华