插入排序知识点汇总:原理、特性与实践

news/2024/12/25 15:57:20/文章来源:https://www.cnblogs.com/java-note/p/18630683

一、基本原理

  1. 概念
    • 插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。可以类比为人们整理手中的扑克牌,每次拿到一张新牌,就将它插入到已经排好序的牌中的合适位置。
  2. 算法步骤
    • 从第一个元素开始,该元素可以认为已经被排序。
    • 取出下一个元素,在已经排序的元素序列中从后向前扫描。
    • 如果该元素(已排序)大于新元素,将该元素移到下一位置。
    • 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。
    • 将新元素插入到该位置后。
    • 重复步骤2 - 5,直到所有元素都插入到有序序列中。

二、时间复杂度

  1. 最好情况
    • 当待排序的序列本身就是有序的时候,插入排序的时间复杂度为\(O(n)\)。这是因为在这种情况下,每次插入新元素时,只需要比较一次就可以确定它的位置,总共需要比较\(n - 1\)次(假设序列有\(n\)个元素)。例如,序列[1, 2, 3, 4, 5],在插入排序过程中,每个元素都只需要比较一次就可以确定其正确位置。
  2. 最坏情况
    • 当待排序的序列是逆序的时候,时间复杂度为\(O(n^2)\)。例如,对于序列[5, 4, 3, 2, 1],第一个元素插入时不需要比较,第二个元素插入时需要比较1次,第三个元素插入时需要比较2次,以此类推,总的比较次数为\(1 + 2+3+\cdots+(n - 1)=\frac{n(n - 1)}{2}\),所以时间复杂度为\(O(n^2)\)
  3. 平均情况
    • 平均时间复杂度也是\(O(n^2)\)。在平均情况下,插入一个元素需要比较和移动大约\(n/2\)次,对于\(n\)个元素,总共需要大约\(n^2/4\)次操作,所以时间复杂度为\(O(n^2)\)

三、空间复杂度

  • 插入排序是一种原地排序算法,它只需要\(O(1)\)的额外空间。这是因为在排序过程中,它只需要有限的几个变量来辅助完成排序,如用于比较和交换元素的临时变量,不需要额外的大量存储空间来复制或存储数据。

四、稳定性

  • 插入排序是稳定的排序算法。所谓稳定性,是指如果在排序前两个元素相等,那么在排序后它们的相对位置不变。例如,有一个序列[(3, a), (3, b)],其中括号内第一个元素是数值,第二个元素是标记。在插入排序过程中,当比较到两个3时,因为插入排序是从后向前扫描已排序序列,会将新元素插入到合适位置,不会改变两个3的相对顺序,所以插入排序是稳定的。

五、代码实现(以Python为例)

def insertion_sort(arr):for i in range(1, len(arr)):current_value = arr[i]position = iwhile position > 0 and arr[position - 1] > current_value:arr[position] = arr[position - 1]position -= 1arr[position] = current_valuereturn arr
  • 在上述代码中,for循环从第二个元素(索引为1)开始遍历数组arrcurrent_value存储当前要插入的元素,position记录当前元素应该插入的位置。while循环用于在已排序的部分中找到合适的插入位置,将比current_value大的元素向后移动,最后将current_value插入到合适的位置。

六、适用场景

  • 插入排序适用于数据量较小或者基本有序的序列。当数据量较小的时候,它的简单性使得它能够快速地完成排序任务,并且它对基本有序的序列非常高效,因为它不需要进行太多的比较和移动操作。例如,在一些实时数据处理场景中,新数据不断到来,并且数据大致上是有序的,插入排序可以很好地用于对这些新数据进行排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858688.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中小企业 CRM 解决方案排名:性价比之选

在如今竞争白热化的商业环境中,应用CRM系统(客户关系管理系统)可以帮助中小企业降本增效。有效的客户管理能帮助企业精准把握市场脉搏,提升客户满意度,减少客户流失,为企业的长远发展提供稳定动力。 本文从中小企业对CRM的具体需求出发,介绍4家适合中小企业的CRM供应商,…

在CAD文件中存储扩展数据

基础知识:根据CAD官方的资料看来,Database作为一个CAD文件数据库的根对象,其包含10个子对象:九大符号表(SymbolTable)和命名对象词典(NamedObjectsDictionary)。 这10个子对象属于整个数据库内的最高层级,直属于Database。除这10个子对象以外,所有DBObject对象都必须…

人员聚集监测识别摄像机

人员聚集监测识别摄像机可以通过高清晰度的摄像头和先进的人脸识别技术,准确地识别出人群中的个体,并记录下他们的行踪和行为。在人员密集的场所,如商场、车站、体育场馆等,这种摄像机能够帮助安保人员更好地掌握人员活动的情况,及时发现异常情况,有效应对突发事件。除了…

CS61B srping 2018 lab03 https://sp18.datastructur.es/

Unit Testing with JUnit, Debugging 准备 装好 CS61B插件(emmmmm,不装也没事) 把lab2 的IntList.java 复制到 lab3/IntList 文件夹. 看看关于测试的课程视频 介绍 啊? JUnit是java测试框架,现在要用JUnit进行单元测试,单元Unit就是把程序分成小块的单元,一个单元的功…

摄像机实时接入分析平台视频分析网关:如何评估视频分析系统的性能?

在当今这个数字化、智能化快速发展的时代,视频分析系统已成为安全监控、交通管理、商业智能等多个领域不可或缺的技术支撑。这些系统的性能评估对于确保其有效性和可靠性至关重要。以下是对视频分析系统性能评估的关键指标和方法的详细探讨,这些评估将帮助我们深入了解系统的…

Protocol Buffers 使用笔记

Protocol Buffers 使用笔记created: 2024-03-04T11:11+08:00 modified: 2024-11-26T15:28+08:00 published: 2024-12-25T15:30+08:00 categories: applicationsProtocol Buffers 简称 protobuf 或者 PB,要解决的问题是这样的: 在互联网上传输大量数据,如果使用 json 等类似格…

域名解析平台有哪些

在互联网的广袤世界中,域名解析平台起着至关重要的作用,它们就像是互联网的 “导航仪”,将人们易于记忆的域名转换为计算机能够理解的 IP 地址,从而确保我们能够顺利访问各类网站和在线服务。域名解析的过程就是将域名翻译为对应的 IP 地址,使得浏览器能够准确地找到服务器…

Pycharm2024.3完整的安装教程(附激活,常见问题处理)

卸载老版本 Pycharm 首先,如果小伙伴的电脑上有安装老版本的Pycharm , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可): TIP:如果你之前使用过本站提供的 激活到 2025 年版本脚本,需要执行对应卸载脚本 /适用2024版本/JetBrains 2023 最新全家桶/jetbra /…

搭建npm私有仓库——verdaccio

前言Verdaccio 是一个简单的、零配置要求的本地私有 npm 注册表。无需整个数据库即可开始!Verdaccio 开箱即用,带有自己的小型数据库,并且能够代理其他注册表(例如 npmjs.org),并在此过程中缓存下载的模块。对于那些希望扩展其存储功能的人,Verdaccio 支持各种社区制作的…

门店协作的未来:协作文档如何提升客户体验?

汽车销售是一种高竞争、高需求精细化管理的业务形态。门店销售团队不仅需要对接客户,还要实时反馈总部的策略与数据。如果销售流程中协同效率不足,往往会导致商机流失和客户满意度下降。协作文档工具的普及,为车企门店带来了全新解决方案。 车企门店销售面临的核心问题 在车…

功率器件的热设计基础(二)——热阻的串联和并联

功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。/ 前言 / 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计…

视频分析设备平台EasyCVR关于未来监控系统可能会集成哪些新技术?

随着科技的飞速发展,监控系统正经历着一场革命性的变革。未来的监控系统将不再是单一的观察和记录工具,而是集成了多种前沿技术的智能平台,它们将极大地提高安全性、效率和响应速度。以下是未来监控系统可能集成的一些关键技术。1、人工智能技术 1)监控系统将越来越多地应用…