news 2025/12/27 17:25:55

-希尔排序

作者头像

张小明

前端开发工程师

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/14 20:57:41

嵌入式周记1

Duration&#xff1a;12月8日&#xff08;周一&#xff09;----10月14日&#xff08;周日&#xff09; 文章目录Duration&#xff1a;12月8日&#xff08;周一&#xff09;----10月14日&#xff08;周日&#xff09;总结&#xff1a;例程1、timg_32bit_timer_mode_periodic_sle…

作者头像 李华
网站建设 2025/12/14 20:53:54

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

1. 为什么这个毕设项目值得你 pick ?安全生产能源安全智慧管理系统的设计与实现全面解析&#xff0c;系统功能模块涵盖应急预案管理、应急资源管理、应急演练管理等18个方面。相比传统选题&#xff0c;本项目具有显著优势&#xff1a;不仅创新性地引入了数据可视化组件ECharts…

作者头像 李华
网站建设 2025/12/24 6:58:31

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

1. 为什么这个毕设项目值得你 pick ?安全生产职业危害智慧管理系统集成了多项功能模块&#xff0c;如职业病防控管理、安全培训管理等二十个子系统。与传统选题相比&#xff0c;该系统的创新性在于结合了最新的数据可视化技术和预警预防机制&#xff0c;能够实现全面的数据监控…

作者头像 李华
网站建设 2025/12/17 8:10:39

信捷XDM PLC三轴可编程运动控制:强大且灵活的工业利器

信捷xdm plc三轴可编程运动控制支持信捷XDM系列PLC 信捷TG765触摸屏 支持直线插补 &#xff0c;圆弧插补&#xff0c;延时&#xff0c;等待输入ON&#xff0c;等待输入OFF&#xff0c;执行输出ON&#xff0c;执行输出OFF。可视化加工轨迹&#xff0c;支持电子手轮&#xff0c;改…

作者头像 李华
网站建设 2025/12/14 20:50:00

每天五分钟:leetcode动态规划-递归与递推_day2

0&#xff09;先记住一句话&#xff08;贯穿两种写法&#xff09;到第 n 阶的方法数&#xff1a;最后一步要么走 1 阶&#xff1a;从 n-1 来要么走 2 阶&#xff1a;从 n-2 来所以永远是&#xff1a;f(n) f(n-1) f(n-2)1&#xff09;递归版本&#xff08;从“大问题”往下问“…

作者头像 李华