news 2026/8/21 4:00:25

-希尔排序

作者头像

张小明

前端开发工程师

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/8/21 18:13:54

【C++ 经典算法】贪心算法求解股票最大利润(兼容 C++98/03)

在股票交易策略分析中&#xff0c;“单次买卖最大化利润” 是经典的算法问题&#xff0c;贪心算法凭借 O (n) 时间复杂度、O (1) 空间复杂度的优势&#xff0c;成为该问题的最优解。本文将从原理、实现、兼容优化三个维度&#xff0c;详解贪心算法求解股票最大利润的完整方案&a…

作者头像 李华
网站建设 2026/8/21 23:19:10

K8S-蓝绿发布与金丝雀发布

一、蓝绿发布在Kubernetes中&#xff0c;蓝绿发布&#xff08;Blue-Green Deployment&#xff09; 是一种部署策略&#xff0c;通过同时维护两个完全独立的生产环境&#xff08;“蓝”和“绿”&#xff09;&#xff0c;在验证新版本&#xff08;绿&#xff09;后&#xff0c;一…

作者头像 李华
网站建设 2026/8/21 8:06:27

并发编程的锁有哪些?怎么分类?

文章目录一、按【实现方式】分类1. synchronized(JVM内置锁)2. lock&#xff08;JUC显示锁&#xff09;二、按【线程是否阻塞】分类1. 阻塞锁2. 自旋锁三、 按【是否公平】划分1. 公平锁2. 非公平锁四、按【锁的重入性】划分1. 可重入锁2. 不可重入锁五、 按【锁的作用范围】划…

作者头像 李华
网站建设 2026/8/21 14:41:33

航空机票预定系统|基于springboot 航空机票预定系统(源码+数据库+文档)

航空机票预定 目录 基于springboot vue航空机票预定系统 一、前言 二、系统功能演示 ​三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue航空机票预定系统 一、前言 博主介绍&am…

作者头像 李华
网站建设 2026/8/21 23:45:15

【奶茶Beta专项】【LVGL9.4源码分析】07-API映射管理

【奶茶Beta专项】【LVGL9.4源码分析】07-API映射管理1 概述1.1 文档目的1.2 代码版本与范围2 设计意图与总体定位2.1 问题背景2.2 API 映射头的角色2.3 设计目标2.4 本文分析对象与侧重点3 使用方法3.1 在 C/C 代码中的使用3.2 在绑定/自动生成工具中的使用3.3 从 v8 升级到 v9…

作者头像 李华
网站建设 2026/8/21 8:48:07

【奶茶Beta专项】【LVGL9.4源码分析】08-theme主题管理

【奶茶Beta专项】【LVGL9.4源码分析】08-theme主题管理1 概述1.1 文档目的1.2 代码版本与范围2 设计意图与总体定位2.1 主题在 LVGL 中扮演的角色2.2 与对象系统/样式系统的关系2.3 主题链与可扩展性3 使用方法3.1 在 C 代码中启用并应用主题3.2 在自定义主题中复用默认行为3.3…

作者头像 李华