跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

数据结构入门:插入排序与希尔排序详解

介绍排序算法概念及应用,详解直接插入排序与希尔排序原理及实现。直接插入排序通过构建有序序列逐步插入元素,时间复杂度 O(N^2),空间复杂度 O(1),属稳定排序。希尔排序作为优化,通过分组预排序缩小增量提高效率,平均时间复杂度约 O(N*logN)。两者适用于小规模或基本有序数据场景。

深海蔚蓝发布于 2026/3/29更新于 2026/9/869 浏览
数据结构入门:插入排序与希尔排序详解

排序的概念及其应用

1.1 排序的概念

排序是指将一串记录按照特定规则递增或递减排列的操作。

1.2 排序的应用

生活中排序思想无处不在。例如电商购物时按好评数排序筛选商品,或大学按教学资源进行排名等。

插入排序

2.1 基本思想

在一个有序数组中,按照规则插入待排序的数字。

算法思路:从单趟排序讲起,选择待插入数字与已排序数组末端的数进行比较。若该值比待插入数字大,则将元素往后挪动一位,继续向前比较。若发现该值比待插入数字小,说明该值的后面一个位置就是待插入数字应该插入的位置,结束循环。

完整的插入排序是在循环地跑单趟排序,初始条件为从待插入数组的第二个元素下标开始。每当单趟排序跑完之后,设置循环条件的值(一开始比较数组末端的位置)。因为已经排好部分数组,每当来一个新数字就得在排好数组中插入,重复上述过程。

2.2 插入排序的代码实现

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

2.3 插入排序算法总结

  • 元素集合越接近有序,直接插入排序算法的时间效率就越高。
  • 时间复杂度:O(N^2)
  • 空间复杂度:O(1)
  • 稳定性:稳定

希尔排序

3.1 基本思想

先选定一个整数 gap,把待排序的数据分成个别组。分组的标准就是所有距离为 gap 的数据分在同一组,并对每一组内的记录进行排序。然后,缩小 gap 的值,重复上述分组和排序的工作。当 gap = 1 时,就相当于直接插入排序了。

3.2 希尔排序的代码实现

void ShellSort(int* a, int n){
    int gap = n;
    while(gap > 1){
        //gap /= 2;
        gap = gap / 3 + 1;
        for(int j = 0; j < gap; j++){
            for(int i = j; i < n; i += gap){
                int end = i - 1;
                int tmp = a[i];
                while(end >= 0){
                    if(tmp < a[end]){
                        a[end + 1] = a[end];
                        end--;
                    }else{
                        break;
                    }
                }
                a[end + 1] = tmp;
            }
        }
    }
}

3.3 希尔排序的特征总结

  • 希尔排序是对直接插入排序的优化。
  • 当 gap > 1 时都是预排序,目的是让数组更接近于有序。当 gap == 1 时,数组已经接近有序的了,这样就会很快。整体而言,可以达到优化的效果。
  • 希尔排序的时间复杂度不好计算,因为 gap 的取值方法很多。一般认为时间复杂度为 O(N*logN),严谨计算则为 O(N^1.3)。

目录

  1. 排序的概念及其应用
  2. 1.1 排序的概念
  3. 1.2 排序的应用
  4. 插入排序
  5. 2.1 基本思想
  6. 2.2 插入排序的代码实现
  7. 2.3 插入排序算法总结
  8. 希尔排序
  9. 3.1 基本思想
  10. 3.2 希尔排序的代码实现
  11. 3.3 希尔排序的特征总结

更多推荐文章

查看全部
  • HTML 前端接入大模型 API:OpenAI 兼容接口快速部署指南
  • OpenClaw 集成百度网页搜索技能指南
  • 文心一言 4.5 评测与本地部署指南:开源大模型的中文能力实测
  • Linux 进程替换原理:从 fork 到 exec 详解
  • 永磁同步电机 PMSM 无感 FOC 驱动:高频注入启动与观测器切换
  • 基于 Netty 构建高性能 HTTP 服务器
  • 基于 Qwen3-VL 构建游戏 AI 视觉决策系统
  • 微信群智能管理:扣子机器人接入实战
  • Gemini 全能 QQ 机器人部署手册
  • 程序员是否只需精通一门编程语言?多语言学习的挑战与价值
  • 智谱 AI 发布开源模型 GLM-4-9B,通用及多模态能力对标行业主流
  • 降低 AIGC 疑似度的实用技巧与工具指南
  • 鸿蒙金融理财全栈项目:生态合作与用户运营优化
  • OpenClaw 跨平台安装教程:Windows、macOS 与 Linux
  • HarmonyOS6 RcButton 组件使用示例与最佳实践
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • OpenClaw 部署指南:环境搭建、模型接入与飞书机器人配置
  • LeetCode 202 快乐数:快慢指针解法详解
  • JiaJiaOCR:纯 Java 实现的 OCR 解决方案
  • JDK 17 安装与环境配置实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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