尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
《大话数据结构》第9章精读:希尔排序与堆排序完整 C++ 实现
1. 引言从简单排序到高效排序简单排序冒泡、直接插入、简单选择的平均时间复杂度都是 O(n²)当数据量增大时效率明显不足。《大话数据结构》第9章接下来介绍了两种重要的改进算法希尔排序插入排序的改进和堆排序选择排序的改进。本文基于《大话数据结构》第9章内容结合《C Primer Plus》的编程视角给出两种算法的完整 C 实现、复杂度分析、对比表格与测试代码方便直接复制运行。2. 希尔排序Shell Sort2.1 核心思想把数组按一定增量gap分组对每组进行直接插入排序。随着增量逐渐减小数组越来越接近有序最后一趟增量变为 1 时就是普通的插入排序。希尔排序通过“跳跃式”的比较与移动大幅减少了插入排序中元素的移动次数。下图展示了希尔排序的分组与跳跃式移动过程2.2 完整实现常用 Knuth 序列#include iostream #include vector using namespace std; void ShellSort(vectorint arr) { int n arr.size(); // 使用 Knuth 序列gap gap * 3 1 int gap 1; while (gap n / 3) { gap gap * 3 1; } while (gap 1) { // 对每个分组进行插入排序 for (int i gap; i n; i) { int key arr[i]; int j i; while (j gap arr[j - gap] key) { arr[j] arr[j - gap]; j - gap; } arr[j] key; } gap / 3; // 缩小增量 } }2.3 复杂度与特点指标说明平均时间复杂度约 O(n^1.3) O(n^1.5)取决于增量序列最坏时间复杂度O(n²)空间复杂度O(1)稳定性不稳定优点实现简单对中等规模数据表现较好代码开销小。3. 堆排序Heap Sort3.1 核心思想利用堆这种数据结构。先把数组建成大顶堆此时堆顶是最大值把它与末尾元素交换然后把剩余部分重新调整为堆重复此过程。堆排序是选择排序的高效改进时间复杂度稳定在 O(n log n)。下图展示了大顶堆的建堆与交换过程3.2 完整实现// 调整以 index 为根的子树使其符合大顶堆 void heapify(vectorint arr, int n, int index) { int largest index; // 假设当前节点最大 int left 2 * index 1; // 左孩子 int right 2 * index 2; // 右孩子 if (left n arr[left] arr[largest]) { largest left; } if (right n arr[right] arr[largest]) { largest right; } // 如果最大值不是当前节点就交换并继续向下调整 if (largest ! index) { swap(arr[index], arr[largest]); heapify(arr, n, largest); } } void HeapSort(vectorint arr) { int n arr.size(); // 1. 建堆从最后一个非叶子节点开始向前调整 for (int i n / 2 - 1; i 0; --i) { heapify(arr, n, i); } // 2. 排序每次把堆顶最大值换到末尾再调整剩余部分 for (int i n - 1; i 0; --i) { swap(arr[0], arr[i]); // 堆顶与末尾交换 heapify(arr, i, 0); // 调整剩余元素 } }3.3 复杂度与特点指标说明时间复杂度最好、平均、最坏都是 O(n log n)空间复杂度O(1)原地排序稳定性不稳定特点建堆时间是 O(n)非常高效。适合大数据量且不需要额外内存。4. 两种算法对比对比维度希尔排序堆排序时间复杂度约 O(n^1.3)O(n log n) 稳定空间复杂度O(1)O(1)稳定性不稳定不稳定实现难度较低中等需要理解堆调整适用场景中等数据量、代码简单要求大数据量、要求时间稳定是否原地排序是是5. 完整测试代码#include iostream #include vector using namespace std; void printArray(const vectorint arr) { for (int x : arr) cout x ; cout endl; } int main() { vectorint arr1 {49, 38, 65, 97, 76, 13, 27, 49, 55, 4}; vectorint arr2 arr1; cout 原数组; printArray(arr1); ShellSort(arr1); cout 希尔排序后; printArray(arr1); HeapSort(arr2); cout 堆排序后; printArray(arr2); return 0; }运行结果原数组49 38 65 97 76 13 27 49 55 4 希尔排序后4 13 27 38 49 49 55 65 76 97 堆排序后4 13 27 38 49 49 55 65 76 976. 总结与思考希尔排序通过增量分组打破了插入排序只能移动相邻元素的限制显著提升了效率。堆排序把“每次选最值”的思想用堆结构高效实现时间复杂度稳定在 O(n log n)。结合《C Primer Plus》的思考堆排序中的 heapify 是典型的递归思想对应书中对递归与树形结构的讲解。两种算法都做到了原地排序体现了“空间效率优先”的设计。下一篇将讲解第9章最经典的两种高效排序归并排序和快速排序。
RELATED

相关推荐

树莓派auto exposure中曝光路径设计思路解析

树莓派auto exposure中曝光路径设计思路解析

目录 一、概述 二、头文件 exposure_mode_helper.h 三、实现文件 exposure_mode_helper.cpp 逐段解析 四、算法完整流程文字版 五、代码实现: 一、概述 ExposureModeHelper 属于 libcamera IPA 模块,是给 AEGC(自动曝光自动增益控制&…

📅 2026/10/30 23:00:22
加载慢3秒,AI直接跳过你

加载慢3秒,AI直接跳过你

很多技术团队把页面速度当成"用户体验优化",觉得慢个一两秒无伤大雅。但在GEO时代,这个认知已经过时了。2026年3月,Google把LCP的"良好"阈值从2.5秒收紧到2.0秒,INP也被提升为与LCP、CLS同等权重的主要信号。…

📅 2026/10/11 7:07:41
会计专业大学期间考什么证

会计专业大学期间考什么证

会计专业考证不要只看证书名字,而要先想清楚:以后想进企业财务、会计师事务所、税务方向、银行金融,还是财务分析和业财融合岗位。从大学生就业和财务职业发展的角度看,会计专业需要建设的能力大致可以分成两部分:一部…

📅 2026/10/14 14:18:55
MORE NEWS

更多资讯

📰

2026年会员管理系统多少钱?先算清交易费率和第二年续费这笔账

年费从几百到几万,差别不在“贵不贵”据华为云社区2026年10月发布的一篇SaaS工具对比梳理,国内会员管理系统的年费跨度很大:码云数智基础版1998元/年,有赞基础版6800元/年起,微盟豪华版可达29800元/年。另一份来自乔拓…

📰

Agentic Coding:从生成代码到交付结果的AI编程范式

简介:一份由北大青鸟人工智能研究院等团队出品的《Agentic Coding:从Vibe Coding到超级个体的进化之路》内部研讨讲稿,面向无编程经验的产品经理、教师、技术创业者,也适合开发者、CTO及架构师建立AI编程的系统认知。内容系统梳理…

📰

AI代码评审两件套:superpowers-skills中如何请求评审,以及如何优雅地回怼反馈

【免费下载链接】superpowers-skills Community-editable skills for Claude Codes superpowers plugin 项目地址: https://gitcode.com/gh_mirrors/su/superpowers-skills 点击查看 免费下载 如果你在用 Claude Code 做开发,superpowers-skills 是 sup…

📰

Milvus 索引不重建也能查:为什么召回率悄悄掉到随机水平

本文摘要:换 Embedding 模型却不重建索引,查询不报错但召回率悄悄跌至随机。通过 IVF_PQ 双层失配机制复现相似度趋同,给出灰度切换方案。适用于新旧模型维度相同的场景,维度变更时查询直接报错。 一、问题与结论 先说结论&#…

📰

MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s

本文摘要:线上订单加联合索引后从 200ms 变 8 秒,索引命中却更慢。根因是 MySQL 8.0 偏好免排序索引,低选择性前缀致回表暴涨。仅适用于非覆盖索引场景,统计信息过期需先刷新再判断。 一、问题与结论 环境:Docker 启动…

📰

【无套路自取】给 Inspector 换上 X 光镜:Odin V3.5 属性绘制器,让 Unity 数据编辑省心得多

【无套路自取】给 Inspector 换上 X 光镜:Odin V3.5 属性绘制器,让 Unity 数据编辑省心得多 【免费下载链接】Unity插件OdinV3.5下载 本仓库提供Unity插件——Odin V3.5的下载资源。Odin是一款强大的Unity插件,旨在提升Unity开发者的生产力&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬