跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C算法

C 语言排序算法详解:插入排序与希尔排序

综述由AI生成插入排序与希尔排序是 C 语言中处理数据有序化的经典算法。插入排序模拟了整理扑克牌的逻辑,通过逐个比较将元素插入到已排序序列的正确位置,适合小规模或基本有序的数据。希尔排序则是插入排序的优化版本,通过引入间隔(gap)进行预排序,逐步缩小间隔直至为 1,显著提升了大规模数据的排序效率。两者在时间复杂度与空间开销上各有特点,掌握其原理有助于在实际开发中选择更合适的排序策略。

DebugKing发布于 2026/3/23更新于 2026/5/34 浏览
C 语言排序算法详解:插入排序与希尔排序

C 语言排序算法详解:插入排序与希尔排序

插入排序

算法思想

插入排序的逻辑其实非常直观,就像我们平时整理扑克牌一样。假设手里已经有一组有序的牌,当拿到新的一张牌时,我们会从右往左依次比较,找到合适的位置将其插入。

在代码层面,这意味着对于每一个待插入的元素 tmp,我们需要将它与前面已排序序列中的元素逐一比较。如果 tmp 比前一个元素小,就继续向前找;如果 tmp 比前一个元素大,说明找到了位置,直接插入即可。

实现思路

  1. 确定范围:假设下标 0 到 end 之间的数据已经是有序的。
  2. 准备插入:取 end + 1 位置的元素作为 tmp(待插入值)。
  3. 移动与比较:将 end 位置的值与 tmp 比较。若 tmp 更小,则将 end 的值后移一位,end 减一,继续向前比较;否则停止循环。
  4. 完成插入:循环结束后,将 tmp 放入 end + 1 的位置。
  5. 遍历数组:重复上述过程,直到整个数组有序。

代码实现

// 插入排序
void InsertSort(int* a, int n) {
    for (int i = 0; i < n - 1; i++) {
        int end = i;
        int tmp = a[end + 1];
        while (end >= 0) {
            if (tmp < a[end]) {
                a[end + 1] = a[end];
                end--;
            } else {
                break;
            }
        }
        a[end + 1] = tmp;
    }
}

注意这里 end 的移动逻辑,它保证了未排序部分的元素能够正确'腾出'空间给 tmp。

希尔排序

算法思想

希尔排序可以看作是插入排序的升级版。普通的插入排序在处理大规模数据时效率较低,因为每次只能移动相邻元素。希尔排序引入了一个间隔(gap)的概念,先将数组按间隔分组,对每组进行插入排序(预排序),然后不断缩小间隔,直到间隔为 1 时再进行最后一次插入排序。

这个过程让数组在最终排序前已经变得'基本有序',从而大幅减少了普通插入排序的比较和移动次数。

实现思路

  1. 分组策略:设定初始间隔 gap,通常取数组长度的三分之一左右。
  2. 预排序:按照 gap 的距离进行插入排序。例如 gap=3,则索引 0, 3, 6... 为一组,1, 4, 7... 为一组,分别排序。
  3. 缩小间隔:每轮排序后,gap 值减小,直到 gap 变为 1。
  4. 最终排序:当 gap=1 时,相当于对整个数组进行一次标准的插入排序,此时由于数组已基本有序,效率极高。

关于 gap 的取值,经验表明使用 gap = gap / 3 + 1 的递减方式效果较好,既能保证快速收敛,又能确保最后一次 gap 恰好为 1。

代码实现

// 希尔排序
void ShellSort(int* a, int n) {
    int gap = n;
    while (gap > 1) {
        // 动态调整 gap,确保最后一步 gap 为 1
        gap = gap / 3 + 1;
        
        for (int i = 0; i < n - gap; i++) {
            int end = i;
            int tmp = a[end + gap];
            while (end >= 0) {
                if (tmp < a[end]) {
                    a[end + gap] = a[end];
                    end -= gap;
                } else {
                    break;
                }
            }
            a[end + gap] = tmp;
        }
    }
}

在这个实现中,内层逻辑与插入排序几乎一致,唯一的区别是将步长 1 换成了当前的 gap 值。这种设计既复用了插入排序的逻辑,又通过间隔跳跃提升了整体性能。

总结

插入排序适合小规模或基本有序的数据,代码简单且稳定。而希尔排序通过引入间隔机制优化了插入排序的性能,是处理中等规模数据时的优选方案。理解这两种算法的核心差异,有助于在实际开发中根据数据特征做出更合理的排序选择。

目录

  1. C 语言排序算法详解:插入排序与希尔排序
  2. 插入排序
  3. 算法思想
  4. 实现思路
  5. 代码实现
  6. 希尔排序
  7. 算法思想
  8. 实现思路
  9. 代码实现
  10. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python 最新版安装 pyqt6-tools 报错解决方案
  • 前端安全:别让你的应用变成黑客的游乐场
  • C++ 多线程同步之条件变量实战
  • C++ 算法刷题实战:重组偶数、体操队形及二叉树路径和
  • AI 程序员上岗,垂类大模型应用迎来井喷期
  • Python 流程控制核心:条件语句与循环实战
  • JavaScript 进度事件详解:从 loadstart 到 loadend
  • C++ 哈希表详解:开散列与闭散列
  • 大模型在影视动漫行业的应用案例详解
  • Java 开发环境搭建:JDK 安装与变量配置详解
  • 前端存储机制:localStorage、sessionStorage 与 Cookie 对比
  • 2026 年 3 月全球 AI 前沿动态:Agent、模型与工具链演进
  • Obsidian Copilot 配置蓝耘 API 实现本地文件智能交互
  • NewStarCTF2025 Week 1 Web 解题报告
  • MaxKB 开源知识库问答系统部署与使用指南
  • AI 绘画的商业应用:广告、插画与游戏设计
  • Git 版本控制从入门到精通
  • 使用 Bright Data Web Scraper API + Python 高效抓取 Glassdoor 数据:从配置到结构化输出全流程实战
  • 前端错误处理最佳实践:构建健壮的用户体验
  • MCP Document Reader:AI 助手本地文档解析工具

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online