news 2026/4/16 12:24:18

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

作者头像

张小明

前端开发工程师

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/4/5 19:41:20

计算机毕业设计springboot大学生心理健康咨询系统 基于Spring Boot的大学生心理健康咨询平台设计与实现 Spring Boot框架下大学生心理健康咨询管理系统开发

计算机毕业设计springboot大学生心理健康咨询系统jpmyh (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着互联网技术的飞速发展,大学生的心理健康问题逐渐受到广泛…

作者头像 李华
网站建设 2026/4/13 14:54:48

钉钉机器人结合HunyuanOCR?实现图片消息智能解析

钉钉机器人结合HunyuanOCR:实现图片消息智能解析 在现代企业办公中,一张截图往往胜过千言万语——会议白板、报销发票、合同条款、产品说明书……越来越多的信息以图片形式在群聊中流转。但问题也随之而来:这些图像里的文字无法被搜索、不能自…

作者头像 李华
网站建设 2026/4/15 10:11:48

Edge扩展程序设想:选中文本区域直接调用HunyuanOCR识别

Edge扩展程序设想:选中文本区域直接调用HunyuanOCR识别 在日常浏览网页时,你是否曾遇到这样的尴尬——看到一段关键信息被嵌入图片、PDF预览模糊无法复制、或是外文图表中的文字难以摘录?传统做法是截图 → 打开OCR工具 → 粘贴识别 → 复制结…

作者头像 李华
网站建设 2026/4/13 8:34:29

CSDN官网技术帖推荐:腾讯混元OCR在实际项目中的落地经验

腾讯混元OCR在实际项目中的落地经验 在金融柜台、政务窗口或是跨境电商后台,每天都有成千上万张身份证、发票、合同被拍照上传。传统流程中,这些图像需要经过多个独立模型接力处理:先检测文字位置,再识别内容,最后抽取…

作者头像 李华
网站建设 2026/4/10 2:20:16

夸克网盘直链下载助手与OCR结合?提取链接中的关键信息

夸克网盘直链下载助手与OCR结合?提取链接中的关键信息 在数字内容共享日益频繁的今天,你是否也遇到过这样的场景:朋友发来一张截图,里面是夸克网盘的分享链接和提取码,但你却无法直接点击或复制?只能手动一…

作者头像 李华
网站建设 2026/4/13 8:26:48

清华镜像源更新日志:HunyuanOCR模型已加入AI仓库

清华镜像源上线 HunyuanOCR:轻量级多模态 OCR 的实践突破 在文档数字化进程不断加速的今天,从身份证识别到合同解析,从视频字幕提取到跨语言翻译,OCR 已不再只是“把图片变文字”的工具。它正演变为一个融合视觉理解、语义推理与结…

作者头像 李华