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

插入排序:扑克牌式的排序算法!

目录

一.引言

二.核心思想

三.性能分析

3.1 时间复杂度

3.2 稳定性

四. 结语


一.引言

       想象一下你正在整理手中的扑克牌:你总是拿起下一张牌,然后将它插入到左手边已经整理好的牌堆中的正确位置。插入排序的工作原理与此如出一辙。它将一个数组(或列表)分为“已排序”和“未排序”两个部分,然后逐一将未排序部分的元素插入到已排序部分的正确位置。

       插入排序因其简洁性、稳定性,以及在处理小规模或“几乎有序”数据时所展现出的高效率,而在实际应用中占据着一席之地。

二.核心思想

       插入排序的核心在于原地构建有序序列,空间复杂度为O(1)。它从第二个元素开始,将其视为待插入的“键”(tmp),然后将这个“键”与前面已排序的序列中的元素逐一比较,如果比它大,就向后移动一位,直到找到一个小于或等于“键”的元素的位置,然后将“键”插入到该位置。

void InsertSort(int* arr, int n)
{// 外层循环:遍历未排序部分的第一个元素// i < n - 1 是因为我们将 arr[i+1] 作为待插入元素for (int i = 0; i < n - 1; i++){int end = i; // end 指向已排序序列的最后一个元素的下标int tmp = arr[end + 1]; // tmp 是待插入的“键”// 内层循环:在已排序序列中寻找 tmp 的合适位置while (end >= 0){// 如果已排序元素 arr[end] 大于待插入的 tmpif (tmp < arr[end]){// 将 arr[end] 向后移动一位,为 tmp 腾出空间arr[end + 1] = arr[end];end--; // 继续向前比较}else{// 找到了一个小于或等于 tmp 的元素,停止比较break;}}// 将 tmp 插入到找到的正确位置(即 end + 1 的位置)arr[end + 1] = tmp;}
}

三.性能分析

3.1 时间复杂度

       插入排序的性能表现高度依赖于输入数据的初始状态,其时间复杂度可以从线性到平方级变化。

  • 最好情况O(N): 当数组已经完全有序时,插入排序达到它的最佳性能。在这种情况下,外循环每次迭代时,待插入的元素(tmp)只需与已排序序列的最后一个元素进行一次比较,内循环会立即终止。因此,总的操作次数与数组元素数量 n 成线性关系。

  • 最坏情况O(N²): 当数组完全逆序时,算法性能最差。在这种情况下:①要插入第 i 个元素时,它必须与前面已排序的 i-1 个元素全部进行比较,并且全部进行移动(或交换),才能到达它最终的位置。②外循环从第二个元素开始(i = 2 到 n),所以需要进行的比较总数大约是:

        这是一个等差数列求和公式:

        根据大 O 的渐进表示法(只保留最高次项,并忽略常数系数):

  • 平均情况 O(N²): 在随机排列的数组中,平均而言,待插入的元素需要移动大约一半的已排序元素。因此,平均情况的时间复杂度与最坏情况相似,也是O(N²)

总结: 插入排序在处理小规模数据或接近有序的数据集时表现出色,但在处理大规模且完全无序的数据时,其二次方的时间复杂度 O(N²) 会使其效率低于其他高效排序算法。

3.2 稳定性

       稳定性是指如果一个数组中有两个或多个具有相同键值(Key)的元素,在排序后,它们在原数组中的相对顺序不会改变

  • 例如,有一个数组 [5a, 3, 5b],其中 5a5b 的值相同,但 5a5b 的前面。

  • 如果排序后的结果是 [3, 5a, 5b],则该算法是稳定的。

  • 如果排序后的结果是 [3, 5b, 5a],则该算法是不稳定的。

        那稳定性有什么用呢?似乎相同的值在前在后对整体排序结果并没有影响。的确对于整数进行排序确实没有影响,但是对于结构体排序,稳定性就显得至关重要了。

struct Product {float price;     // 主要排序键:价格int relevance;   // 次要排序键:产品相关性评分(越高越好)// ... 其他信息(名称、销量等)
};

用户想实现这样的排序需求:首先按照价格(price)升序排列,如果价格相同,则按照相关性评分(relevance)降序排列。

产品ID价格(key)相关性(次序)原始顺序
A100951
B200802
C100703

第一次排序(按次要键): 先按相关性降序排序。

结果A(95)B(80)C(70)

A 和 C 仍然保持了 AC 前面的原始顺序)

第二次排序(按主要键):价格升序排序。

  • 价格为 100 的元素是 AC

  • 稳定排序算法会确保在处理价格相同的元素时,它们之间已经建立好的“相关性降序”顺序不被破坏。

产品ID价格相关性第一次排序后的顺序最终稳定排序结果
A1009511
C1007032
B2008023

如果第二次排序使用的是不稳定算法,那么在对 A 和 C 进行排序时,它可能会错误地交换 A 和 C 的相对位置,导致最终结果中价格相同的 C 跑到了 A 的前面,破坏了按相关性预先建立好的次序。

       根据以上总结,由于插入排序在遇到相等的元素时,会停止向前移动,并将待插入元素放置在原先那个相等元素的右侧,因此它保持了相等元素的相对顺序。所以,插入排序是稳定的


四. 结语

        插入排序以其优雅和直观性,在众多排序算法中占有一席之地。尽管在实际中并不会直接应用插入排序来解决复杂排序问题,但凭借其在处理小规模数据或接近有序的数据集时表现出色的特点,往往作为更复杂排序算法(如快速排序、归并排序)的辅助算法。

       笔者最近会快快更新完其他排序算法的!!!

http://www.dtcms.com/a/536543.html

相关文章:

  • 如何实现简单的HTTP代理服务器
  • vscode断点使用
  • 做自己网站做站长网站模板对seo的影响
  • Rust中的异常处理方式
  • ETCD 学习使用
  • 新能源汽车故障诊断与排除虚拟实训软件——赋能职业教育新工具
  • 自用提示词02 || Prompt Engineering || RAG数据切分 || 作用:通过LLM将文档切分成chunks
  • 网站开发实战作业答案成功网站案例有哪些
  • 对电子商务网站建设与管理的理解我想做个网站推广怎么做
  • 青少年机器人技术(六级)等级考试试卷-实操题(2025年9月)
  • Spring Boot核心知识点全解析
  • 如何在Qt QML中定义枚举浅谈
  • 6 mysql源码中的查询逻辑
  • 网站a记录的是做cname网页设计欣赏分析
  • Optuna 黑科技自动化超参数优化框架详解
  • 江西省第二届职业技能大赛网络安全赛题 应急响应
  • 网站制作哪家好又便宜东莞建设企业网站
  • 提高命令行运行效率-正则 表达式
  • wordpress自适应建站汽车网有哪些网站大全
  • 爱站网是干嘛的怎么做废品收购网站
  • 如何从 GitHub 大仓库中只下载指定目录
  • LeetCode 22. 括号生成
  • IHR 2025 | 移远通信携Robrain AI解决方案亮相,开启机器人全感官交互新纪元
  • 淘宝客做网站自动更新写wordpress插件吗
  • 金融--------
  • 视频号AI口播:中老年赛道发力
  • 「LegionSpace Hackathon」 通付盾第六届黑客松即将开启
  • STM32外设面试速通:UART、I2C、SPI、DMA、RAM/FLASH与ADC/DAC
  • “芯”动力,净无止境:华芯微特的吸尘器控制方案详解
  • FFmpeg 基本数据结构 AVIOContext分析