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

内部排序-直接插入排序

内部排序-直接插入排序

写在前面:参考《数据结构(C语言版)》严蔚敏 吴伟民 编著 清华大学出版社 2008年10月第27次印刷

📋 算法概述

直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排号序的有序表中,从而得到一个新的、记录数增1的有序表。

🎯 算法特点

特性 说明
稳定性 稳定排序算法
原地排序 是,只需要常数级的额外空间,所以空间复杂度为O(1)
最佳情况 O(n) - 当输入数据已经是正序时
最差情况 O(n²)- 当输入数据是反序时
平均情况 O(n²) - 所以时间复杂度为O(n²)

🔍 算法原理

tips:联想我们在打扑克的时候,整理手牌的过程。目前手上有5张牌,分别是黑桃7、黑桃8、黑桃6、黑桃10和黑桃5。现在需要按照从小到大的顺序排列。

  1. 将第一个元素视为已排序序列:黑桃7
  2. 从下一个元素开始,视为待插序列key:黑桃8
  3. 将待插序列key与已排序序列从后向前对比:黑桃8对比黑桃7
    4. 待插序列key大于或等于已排序列:若对比到第一个元素,则跳到步骤2;其它则重复步骤3
    2. 待插序列key小于已排序列:黑桃6对比黑桃8,则将黑桃8向后移动一位。此时序列:黑桃7、空隙、黑桃8、黑桃10和黑桃5。重复步骤3
  4. 重复步骤23:此时序列:黑桃6、黑桃7、黑桃8、黑桃10和黑桃5
  5. 终止条件:重复步骤23,直到所有元素都插入到正确位置。此时序列:黑桃5、黑桃6、黑桃7、黑桃8和黑桃10

💻 C# 实现代码

🚀示例

/// <summary>/// 对 list 直接插入排序 从小到大/// </summary>/// <param name="list">数据列表</param>private void StraightInsertionSort(List<int> list){if (list == null || list.Count == 0) return;/**初始化:49, 38, 99, 13, 49, 57* 第一趟: 38, 49, 99, 13, 49, 57* 第二趟: 38, 49, 99, 13, 49, 57* 第三趟: 38, 49, 空, 99, 49, 57* 第三趟: 38, 空, 49, 99, 49, 57* 第三趟: 空, 38, 49, 99, 49, 57* 第三趟: 13, 38, 49, 99, 49, 57* 第四趟: 13, 38, 49, 49, 99, 57* 第五趟: 13, 38, 49, 49, 57, 99*/for (int i = 1; i < list.Count; i++){int current = list[i];int j = i - 1;// 移动元素而不是交换while (j >= 0 && list[j] > current){list[j + 1] = list[j];j--;}list[j + 1] = current;}}

🧪 算法演示

示例执行过程

输入数组: [49, 38, 99, 13, 49, 57]

📊 原始数组: 49, 38, 99, 13, 49, 57🔄 第 1 趟排序后: 38, 49, 99, 13, 49, 57
🔄 第 2 趟排序后: 38, 49, 99, 13, 49, 57
🔄 第 3 趟排序后: 38, 49, 空, 99, 49, 57
🔄 第 3 趟排序后: 38, 空, 49, 99, 49, 57
🔄 第 3 趟排序后: 空, 38, 49, 99, 49, 57
🔄 第 3 趟排序后: 13, 38, 49, 99, 49, 57
🔄 第 4 趟排序后: 13, 38, 49, 49, 99, 57
🔄 第 5 趟排序后: 13, 38, 49, 49, 57, 99✅ 排序后的数组: 13, 38, 49, 49, 57, 99

📝 实践

扩展思考题

  1. 如何修改算法实现降序排序?
  2. 使用不同举例感受排序过程、稳定性(11,22,33,44,55或者55,44,33,22,11或者11,33,22,33,22等)?
  3. 在实际项目中,什么情况下会选择使用这种排序?

适用场景

场景 适用性 原因
小规模数据 常数因子小,实际运行效率高
基本有序数据 接近最好情况O(n)的时间复杂度
链表结构 插入操作只需改变指针,无需移动元素
在线排序 可以动态插入新元素到已排序序列
大规模无序数据 O(n²)的时间复杂度导致性能差
http://www.wxhsa.cn/company.asp?id=2058

相关文章:

  • 玩转n8n测试自动化:核心节点详解与测试实战指南
  • Linux:龙晰系统(Anolis)更新yum(dnf)仓库源
  • (笔记)多项式基础 FFT
  • MAC tomcat启动报错
  • 研究生-必看-倒计时3天/武汉科技大学主办/稳定EI会议/高层次教授出席报告
  • LGP7113 [NOIP 2020] 排水系统 学习笔记
  • MySqlException: Incorrect string value: \xE6\x99\xBA\xE8\x83\xBD... for column FieldName at row 1
  • Burp Suite Professional 2025.9 发布 - Web 应用安全、测试和扫描
  • SQL Server 2022 RTM 累积更新 #21 发布
  • 针对WPF的功耗优化(节能编程)
  • Docker 清理完整指南:释放磁盘空间的最佳实践 - 详解
  • 微算法科技(NASDAQ: MLGO)开发Rollup技术,探索区块链扩展性解决方案
  • 征稿倒计时3天/武汉科技大学主办/医学人工智能/现可享优惠
  • 生成更智能,调试更轻松,SLS SQL Copilot 焕新登场!
  • NOI linux使用教程
  • springboot 文件处理框架
  • Docker:龙晰系统(Anolis)更新yum源下载docker
  • 针对单输入单输出、多输入多输出及三阶系统带约束的模型预测控制的实现
  • vue3中父子组件数据同步的默认方式update:xxx
  • 解决 C# 当另一个read操作挂起时不能调用read方法的问题
  • AI辅助编程_工具和方式
  • [完结10章]Java大模型工程能力必修课,LangChain4j 入门到实践
  • k8s源码分析——kubectl命令行交互
  • 将 seata 2.5 发布到私服
  • 一些感悟
  • 五款免费低代码平台深度横评:斑斑、简道云、宜搭、氚云、织信如何选?
  • ubuntu历史版本下载
  • 读书笔记:数据库索引的智能优化:反向键与降序索引
  • 代码随想录算法训练营第十天| 232.用栈实现队列、 225. 用队列实现栈、20. 有效的括号 、1047. 删除字符串中的所有相邻重复项
  • 零成本搭建企业系统:五款免费低代码平台推荐