news 2026/6/10 16:57:10

-希尔排序

作者头像

张小明

前端开发工程师

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/6/10 11:07:35

交互噪声(Interaction Noise):推荐系统中被忽视却关键的问题

在推荐系统中&#xff0c;模型学习的核心依据是用户–物品交互数据。然而&#xff0c;这些交互并不总能真实反映用户的内在偏好&#xff0c;其中夹杂的大量干扰信号被称为 交互噪声&#xff08;Interaction Noise&#xff09;。如果不加处理&#xff0c;交互噪声会显著降低推荐…

作者头像 李华
网站建设 2026/6/10 17:11:20

无刷直流电机双闭环仿真:稳定运行与制动工况下的调制探索

无刷直流电机稳定运行和制动工况双闭环仿真&#xff0c;PWM-ON-PWM,PWM-OFF-PWM调制方式。 图一为拓扑图&#xff0c;图二为调制方式&#xff0c;图三为转速和电磁转矩波形&#xff0c;图四和图五为三相电流和电磁转矩放大和整体图&#xff0c;换相区间电磁转矩幅值较小&#x…

作者头像 李华
网站建设 2026/6/10 17:24:21

聊聊三相、五相电机的容错控制

三相、五相电机容错控制 三相电机断开一相容错控制&#xff1b; 五相电机断开一相、相邻两相容错控制在电机控制领域&#xff0c;容错控制可是个相当重要的课题。想象一下&#xff0c;电机在运行过程中突然某一相出了问题&#xff0c;如果没有有效的容错机制&#xff0c;那整个…

作者头像 李华
网站建设 2026/6/10 0:45:54

Superset,基于web的开源BI工具,github三万star

BI工具是数据分析的得力武器&#xff0c;目前市场上有很多BI软件&#xff0c;众所周知的有Tableau、PowerBI、Qlikview、帆软等&#xff0c;其中大部分是收费软件或者部分功能收费。这些工具一通百通&#xff0c;用好一个就够了&#xff0c;重要的是分析思维。 我一直用的Tabl…

作者头像 李华
网站建设 2026/6/10 15:58:03

9.28总结

9.28总结 知识回顾 # 1. 封装一个函数&#xff1a;获取指定数据的阶乘 【没有指定数据的话默认求10的阶乘】 默认参数 # 阶乘 比如5&#xff01;5*4*3*2*1 # 未知数据 有1个 # 是否需要返回结果 def factorial(num10):result 1for i in range(num, 0, -1):result * ireturn…

作者头像 李华