news 2026/4/6 2:59:52

-希尔排序

作者头像

张小明

前端开发工程师

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/5 20:41:40

昇腾CANN从单算子到融合优化实战

目录 1 摘要 2 技术原理 2.1 架构设计理念解析 2.2 核心算法实现 2.2.1 三级流水线设计原理 2.2.2 Tiling策略与数据重用 2.3 性能特性分析 2.3.1 理论性能模型 2.3.2 实测性能数据 3 实战部分 3.1 完整可运行代码示例 3.2 分步骤实现指南 步骤1&#xff1a;环境配…

作者头像 李华
网站建设 2026/3/28 9:17:31

大数据项目阿里云抢占式服务器

一、学生有免费额度可以使用 查看是否有免费的额度&#xff1a; https://university.aliyun.com/?spm5176.29458888.J_9220772140.19.6e632868x2bj7D 或者&#xff1a; https://free.aliyun.com/?spm5176.28623341.J_9220772140.18.4c044519hKalBC 二、购买抢占式资源服务…

作者头像 李华
网站建设 2026/4/5 11:28:46

Flink源码阅读:如何生成JobGraph

前文我们介绍了 Flink 的四种执行图&#xff0c;并且通过源码了解了 Flink 的 StreamGraph 是怎么生成的&#xff0c;本文我们就一起来看下 Flink 的另一种执行图——JobGraph 是如何生成的。 StreamGraph 和 JobGraph 的区别 在正式开始之前&#xff0c;我们再来回顾一下 Stre…

作者头像 李华
网站建设 2026/3/19 13:35:42

21、GNU 开发实用工具:函数、变量与调试技巧

GNU 开发实用工具:函数、变量与调试技巧 1. 关联数组与命名栈 在开发过程中,关联数组和命名栈是非常实用的数据结构。对于关联数组,可使用 defined 函数来测试键是否存在。 defined Arguments: 1: Name of associative array2: The key to test Returns: $(true) if …

作者头像 李华
网站建设 2026/3/28 4:25:24

YOLOv8+PyQt5车辆类型检测(可以重新训练,yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

资源包含可视化的车辆类型检测系统&#xff0c;基于最新的YOLOv8训练的车辆类型检测模型&#xff0c;和基于PyQt5制作的可视化车辆类型检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的21种车辆类型&#xff0c;包…

作者头像 李华
网站建设 2026/4/3 6:07:11

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

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

作者头像 李华