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

算法-希尔排序

希尔排序 (Shell Sort)

像“分组接力赛”一样,一开始步长(gap)很大,把相隔很远的元素分到一组进行插入排序,让数据能快速跨越到接近最终位置的地方(预排序);然后不断缩小步长,让数组越来越接近整体有序;最后当步长为 1 时,整个数组只需进行一次普通的插入排序就能轻松搞定。

核心代码

#include <stdio.h> // 希尔排序函数 void shellSort(int arr[], int n) { // 初始步长设为数组长度的一半,每次缩小为原来的一半,直到为1 for (int gap = n / 2; gap > 0; gap /= 2) { // 从第 gap 个元素开始,对每个子序列进行插入排序 for (int i = gap; i < n; i++) { int temp = arr[i]; // 暂存当前需要插入的元素 int j = i; // 在当前子序列中,将比 temp 大的元素向后移动 gap 个位置 // j - gap >= 0 保证不越界 while (j - gap >= 0 && arr[j - gap] > temp) { arr[j] = arr[j - gap]; j -= gap; } // 找到正确位置后,将 temp 插入 arr[j] = temp; } } } // 打印数组的辅助函数 void printArray(int arr[], int n) { for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } printf("\n"); } int main() { int arr[] = {64, 34, 25, 12, 22}; int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度 printf("排序前:"); printArray(arr, n); shellSort(arr, n); // 调用希尔排序 printf("排序后:"); printArray(arr, n); return 0; }

示例演示

{64, 34, 25, 12, 22}

第 1 趟:步长 gap = 2 (5/2)
目标:将相隔 2 个位置的元素分为一组进行预排序。
分组情况:
组1(下标 0, 2, 4):{64, 25, 22}
组2(下标 1, 3):{34, 12}
对组1进行插入排序:22 < 25 < 64,排序后组1变为 {22, 25, 64}。
对组2进行插入排序:12 < 34,排序后组2变为 {12, 34}。
第 1 趟结束:数组变为 [22, 12, 25, 34, 64],数据整体更有序了。

第 2 趟:步长 gap = 1 (2/2)
目标:步长缩小为 1,相当于对整个数组进行一次普通的插入排序。
处理元素 12(下标 1):12 < 22,22 往后挪,12 插入到最前面。数组变为:[12, 22, 25, 34, 64]
处理元素 25(下标 2):25 > 22,无需挪动。
处理元素 34(下标 3):34 > 25,无需挪动。
处理元素 64(下标 4):64 > 34,无需挪动。
第 2 趟结束:排序完成。
最终结果:[12, 22, 25, 34, 64]

复杂度

时间复杂度是\(O(n^{1.3})\)(平均情况,具体取决于步长序列的选取;最坏情况为\(O(n^2)\))
空间复杂度是\(O(1)\)(原地排序,仅需常数级的额外空间用于暂存元素)

http://www.jsqmd.com/news/1179899/

相关文章:

  • C++高性能文件传输系统:多线程与异步I/O架构实战
  • MATLAB版三重DES加密工具,专为8字节明文设计,含完整加解密流程
  • SAP MM SPRO 配置 T159L 表:3种“交货完成”标识的业务场景与影响分析
  • Flask + ECharts 构建城市距离查询工具:3步部署与API设计
  • 六本重塑技术管理者认知的工程管理经典书单
  • 20行JavaScript实现ChatGPT-like流式对话界面
  • 北京企业商事诉讼律师推荐:复杂案件处理能力 - 品牌深度评测
  • 2026年济宁市微山县贵金属旧料回收优质靠谱实体门店精选五家 黄金回收铂金回收白银回收彩金回收真实探店测评清单+联系方式推荐 - 亦辰小黄鸭
  • sra_scann_adapter技术原理深度解析:从算法到硬件优化
  • AutoCAD 2024 机械零件库:300张标准件图纸分类管理与快速调用指南
  • 模板驱动型文档自动化:从内容复用到业务流触发
  • OpenCart 3单页结账插件:免代码安装,含多语言包与后台订单管理支持
  • 从零开始解密动物森友会:NHSE存档编辑器的技术深度解析
  • Unity海港环境资源包Seaside Docks:从模块化资产到性能优化的完整实战指南
  • Unity Mesh优化实战:从顶点压缩到数据剔除的性能提升指南
  • Unreal Engine C++ BuildingEscape项目常见问题与解决方案
  • 《Java 100 天进阶之路》第55篇:线程池ThreadPoolExecutor(2026版)
  • BQ25887与PIC18F4515实现锂电池组高效平衡管理
  • 学生分数管理后台:含批量导入、分角色操作与成绩分析的PHP+JS完整工程
  • 2026年CIM电子沙盘服务商选型指南
  • UG NX C++异常报错深度解析:从运行时库到二次开发的系统性解决方案
  • 2026武汉中职择校深度评测:武汉光谷科技职业技术学校到底怎么样?98%升学率+全国唯一海陆空实训基地全解析 - 博客万
  • VSCode 1.90 高效配置指南:5分钟完成10项核心生产力设置
  • QEMU 模拟 ARM 与 VMware 虚拟 x86:3大性能瓶颈实测与选型指南
  • Go写的简易网盘源码包,带数据库脚本、全模块单元测试和架构图
  • Windows XP Build 2531修改版虚拟机安装与稳定性测试指南
  • B站弹幕分析API调用限制与用量边界详解
  • 加油站微信小程序毕业设计全套:含前端代码、Java后台(SSM)、文档与操作视频
  • Django学生成绩管理系统毕设资源包:含可运行代码、数据库脚本、部署指南与答辩材料
  • 智星云/并行超算云 3大平台对比:按需计费、数据持久化与新手友好度实测