news 2026/7/14 22:47:46

算法逻辑:通过将待排序元素逐个插入到已排序序列的合适位置来实现排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法逻辑:通过将待排序元素逐个插入到已排序序列的合适位置来实现排序

一、直接插入排序
算法逻辑:通过将待排序元素逐个插入到已排序序列的合适位置来实现排序。代码中通常使用一个临时变量tmp暂存当前待插入元素,然后从后向前在已排序部分比较并移动元素,找到插入位置后完成插入。

性能分析

  • 最好情况(原序列已有序):
    • 比较次数:$ n - 1 $
    • 移动次数:0
  • 最坏情况(原序列逆序):
    • 比较次数:$ \sum_{i=1}^{n-1} i = \frac{n(n-1)}{2} $
    • 移动次数:$ \sum_{i=2}^{n} (i+1) = \frac{(n+3)(n-2)}{2} $
  • 平均情况:比较和移动次数均约为 $ \frac{n^2}{4} $
  • 时间复杂度:$ O(n^2) $
  • 空间复杂度:$ O(1) $(仅需一个辅助变量)
  • 稳定性:稳定(相同元素不会改变相对顺序)
definsertion_sort(arr):foriinrange(1,len(arr)):tmp=arr[i]# 暂存待插入元素j=i-1# 向前查找插入位置whilej>=0andarr[j]>tmp:arr[j+1]=arr[j]j-=1arr[j+1]=tmp# 插入正确位置returnarr

二、冒泡排序
算法逻辑:通过相邻元素两两比较,若逆序则交换,每一趟遍历将最大元素“沉”到最后。最多进行 $ n-1 $ 趟,若某趟未发生交换,则说明序列已有序,可提前结束。

性能特点

  • 最好情况(序列已有序):
    • 比较次数:$ n - 1 $
    • 交换次数:0
    • 可通过标志位优化提前退出
  • 最坏情况(完全逆序):
    • 比较次数:$ \frac{n(n-1)}{2} $
    • 交换次数:$ \frac{n(n-1)}{2} $
  • 时间复杂度:$ O(n^2) $
  • 空间复杂度:$ O(1) $
  • 稳定性:稳定
defbubble_sort(arr):n=len(arr)foriinrange(n-1):swapped=Falseforjinrange(n-1-i):ifarr[j]>arr[j+1]:arr[j],arr[j+1]=arr[j+1],arr[j]swapped=Trueifnotswapped:# 无交换说明已有序breakreturnarr

这类排序算法属于简单排序算法,适用于小规模数据或教学场景,是数据结构与算法的基础内容,广泛应用于编程考试、面试题及软件设计基础知识体系中。
在实际应用中,直接插入排序的效率通常高于冒泡排序,主要原因如下:

1.比较和交换次数更少

  • 插入排序:每趟只需将当前元素插入到已排序部分的正确位置,过程中只进行必要的比较和移动(不涉及频繁交换)。
    • 在最好情况下(已有序),仅需 $ n-1 $ 次比较,0 次移动。
    • 平均情况下,比较和移动次数约为 $ \frac{n^2}{4} $。
  • 冒泡排序:每趟都要对相邻元素两两比较,并在逆序时进行交换。
    • 即使数据已经有序,若未加优化仍会执行全部趟数;虽然可通过标志位优化提前退出,但最坏情况下的交换次数高达 $ \frac{n(n-1)}{2} $,远高于插入排序的数据移动量。

⚠️ 注意:插入排序中的“移动”是赋值操作(通过tmp和后移实现),而冒泡排序中的“交换”是三个赋值完成一次 swap,代价更高。

2.实际运行性能更优

  • 插入排序具有更好的缓存局部性(访问连续内存),适合现代计算机架构。
  • 更少的写操作使其在嵌入式系统或写入成本高的存储中更具优势。

3.适应性强

  • 插入排序对接近有序的数据表现极好,时间复杂度趋近于 $ O(n) $。
  • 冒泡排序即使经过优化,在部分有序情况下也难以达到同样响应速度。

4.代码执行效率对比示例

对于相同输入[5, 1, 2, 3, 4]

  • 插入排序:只需将5向右移动一位,其余元素前移一格,整体移动较少。
  • 冒泡排序:需要多次交换才能将5“冒泡”到最后,中间产生大量冗余交换。

结论

虽然两者时间复杂度均为 $ O(n^2) $,但插入排序的实际执行效率显著优于冒泡排序。因此,在简单排序算法中,插入排序是更推荐使用的方案,尤其适用于小规模或基本有序的数据集。

# 示例:插入排序比冒泡排序更快地处理接近有序数据arr1=[2,1,3,4,5]print("原数组:",arr1)print("插入排序结果:",insertion_sort(arr1.copy()))print("冒泡排序结果:",bubble_sort(arr1.copy()))

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 21:59:17

C#调用HunyuanOCR接口示例代码分享(基于HttpClient)

C# 调用 HunyuanOCR 接口实战:轻量大模型与企业应用的高效集成 在银行柜台,一名柜员将一张身份证放在扫描仪上,不到三秒,姓名、性别、身份证号等信息已自动填入业务系统;在医院档案室,上千份手写病历正被高…

作者头像 李华
网站建设 2026/7/14 22:00:30

Dify可视化编排调用HunyuanOCR API实现合同识别机器人

Dify可视化编排调用HunyuanOCR API实现合同识别机器人 在企业日常运营中,每天都有成百上千份合同、发票、证件等待处理。传统方式依赖人工逐字录入,效率低、易出错,尤其当文档格式多样、语言混杂时,更是苦不堪言。有没有一种方法&…

作者头像 李华
网站建设 2026/7/14 22:01:39

计算机毕业设计springboot玩具公司进销存管理系统 计算机毕业设计springboot玩具公司进销存管理系统 SpringBoot框架下的玩具公司库存、采购及销售一体化管理系统

计算机毕业设计springboot玩具公司进销存管理系统4bas39 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着信息技术的飞速发展,传统玩具公司的进销存管理方式面临着…

作者头像 李华
网站建设 2026/7/14 22:26:30

C++游戏引擎热更新机制实现(支持动态扩展的底层原理剖析)

第一章:C游戏引擎热更新机制的核心概念在现代C游戏引擎开发中,热更新机制是实现不停机修复逻辑、迭代功能的关键技术。它允许开发者在程序运行期间动态替换或修改代码逻辑,而无需重启整个应用,极大提升了线上服务的稳定性和开发效…

作者头像 李华
网站建设 2026/7/8 15:54:30

MyBatisPlus整合Spring Boot管理HunyuanOCR任务记录

MyBatisPlus整合Spring Boot管理HunyuanOCR任务记录 在企业级AI应用落地的过程中,一个常被忽视但至关重要的环节是:如何让每一次模型推理都“有迹可循”。尤其是在OCR这类高频、异步、结果敏感的场景中,如果系统无法追踪任务状态、无法回溯失…

作者头像 李华
网站建设 2026/7/2 13:23:06

FastStone Capture注册码失效?不如试试HunyuanOCR做截图识别

HunyuanOCR:当截图识别遇上大模型,告别注册码困扰 在日常办公中,你是否也经历过这样的瞬间:正准备用熟悉的截图工具提取一段文档内容,却发现软件突然弹出“注册码无效”或“试用期已过”的提示?FastStone C…

作者头像 李华