当前位置: 首页 > news >正文

希尔排序:高效插入排序的进阶之道

希尔排序:高效插入排序的进阶之道

  • 基本概念
  • 工作原理
  • 增量序列的选择
  • 实现
  • 分析

基本概念

希尔排序(Shell Sort)是插入排序的改进版本,由计算机科学家唐纳德・希尔(Donald Shell)于 1959 年提出。它通过引入「增量序列」的概念,打破了插入排序 “只能相邻元素交换” 的限制,大幅提升排序效率,尤其适合中等规模的数组排序。

与普通插入排序(仅能交换相邻元素)不同,希尔排序先通过 较大的间隔(增量) 对元素 “分组排序”,逐步缩小间隔,最终在间隔为 1 时退化为普通插入排序(此时数组已接近有序,插入排序效率最优)。

工作原理

以该数组为例
在这里插入图片描述

  • 选择合适的增量序列
    确认其为递减的,我通常设置为 gap = n/3+1。该数组中,第一次的 增量序列为3,所以后续我就以gap=3为例讲解过程

  • 根据增量序列分组
    这一步就是希尔排序的核心,我把间隔为三的元素分为一组,上述数组分组后如下图所示在这里插入图片描述
    至此数组被分为三组:[64,12,90],[34,22],[25,11],后面我简称其为增序数组

  • 依次进行插入排序
    我在排序算法入门:直接插入排序详解一文中详细介绍了插入排序,如果你尚不清楚可以参考这篇文章。这里我还是模拟一次详细过程帮你理解:
    我们用变量end表示有序区的最后一个元素,end+gap表示同组增序数组的元素
    在这里插入图片描述
    通过逻辑比较,关注end的位置,如其超出数组了代表达到数组头部。在这里插入图片描述
    你需要了解直接插入排序才能理解上述过程,因为二者没有区别。

  • 缩小增量重复过程
    缩小gap的值,直到gap==1时,其就是完全的直接插入排序

增量序列的选择

增量序列的选择有很多,不同的选择会产生不同的时间复杂度,我给出我用过的几种:

  • 希尔最初的增量序列
    规则:gap = n / 2,每次循环 gap /= 2(如 n=10 时,增量为 5, 2, 1)。
    最易理解,但效率不是最优,时间复杂度约为 O(n^2)
  • Knuth 增量序列
    由公式 gap = 3 * gap + 1 生成
    使时间复杂度优化至约O(n^1.5),是实践中较常用的序列。
  • Sedgewick 增量序列
    结合两种模式的序列:D=9∗4^i - 9∗2^i +1 或 4i−3∗2^i+1
    理论上时间复杂度接近O(n^1.3)

实现

void ShellSort(int arr[], int n)
{int gap = n;while (gap > 1) // 直到 gap==1 时,为直接插入排序{gap = gap / 3 + 1; // 修改增量序列for (int i = 0; i < n - gap; i++){	int end = i;int tmp = arr[end + gap];while (end >= 0){if (arr[end] > tmp){arr[end + gap] = arr[end];end -= gap;}else{break;}}arr[end + gap] = tmp;}}
}

分析

希尔排序是不稳定排序(相同元素的相对位置可能因 “分组排序” 改变),但平均效率优于普通插入排序。

http://www.lryc.cn/news/611607.html

相关文章:

  • 【JS-7-ajax】AJAX技术:现代Web开发的异步通信核心
  • 【Java String】类深度解析:从原理到高效使用技巧
  • 生成网站sitemap.xml地图教程
  • 从代码学习LLM - llama3 PyTorch版
  • GitHub Spark公共预览版上线
  • 利用OJ判题的多语言优雅解耦方法深入体会模板方法模式、策略模式、工厂模式的妙用
  • 本地服务器端部署基于大模型的通用OCR项目——dots.ocr
  • 达梦数据库日常运维命令
  • cdn是什么
  • 【C++】unordered系列容器使用及封装
  • 生成式 AI 重塑自动驾驶仿真:4D 场景生成技术的突破与实践
  • QT----不同线程中信号发送了槽函数没反应QObject::connect: Cannot queue arguments of typeXXX
  • SG105 Pro 网管交换机的3种VLAN配置
  • java实现生成自定义二维码
  • 软考信息安全工程师11月备考
  • Ragflow介绍与安装
  • 考研408_数据结构笔记(第四章 串)
  • Spearman 相关系数与 Pearson 相关系数的区别
  • Java 工具类的“活化石”:Apache Commons 核心用法、性能陷阱与现代替代方案
  • 湖南14个市州分流线得分率对比
  • 【科研绘图系列】R语言绘制瀑布图
  • RNN梯度爆炸/消失的杀手锏——LSTM与GRU
  • 自学嵌入式 day45 ARM体系架构
  • 异世界历险之数据结构世界(非递归快排,归并排序(递归,非递归))
  • Leetcode题解:739每日温度,用单调栈解决问题!
  • 分布式存储 Ceph 的演进经验 · SOSP 2019
  • 从零搭建React框架--第一章:create-react-app、antd、less
  • 深度解析|资源位管理工具如何重构媒体商业化效率?
  • 《算法导论》第 8 章—线性时间排序
  • 福彩双色球第2025090期篮球号码分析