【十大排序算法】插入排序

插入排序,如一位细心的整理者,
她从序列的左端开始,
挨个将元素归位。

每当她遇到一个无序的元素,
便将它插入已经有序的部分,
直至所有元素有序排列。

她不张扬,却有效率,
用自己的方式,
为序列找到了平衡与秩序。

文章目录

  • 一、插入排序
  • 二、发展历史
  • 三、处理流程
  • 四、算法实现
  • 五、插入排序的特性
  • 推荐阅读

一、插入排序

插入排序是一种简单直观的排序算法。插入排序的思想类似于我们打扑克牌时的排序过程:每次从未排序的牌堆中取出一张牌,并插入到已排序的牌堆中的正确位置。

具体来说,插入排序的过程如下:

  1. 将数组分成已排序区间和未排序区间,初始时已排序区间只包含第一个元素。
  2. 从未排序区间取出一个元素,依次与已排序区间的元素比较,找到合适的位置插入。
  3. 将该元素插入到已排序区间的正确位置。
  4. 重复步骤 2 2 2 3 3 3,直到未排序区间为空,整个数组都有序为止。

二、发展历史

插入排序作为最简单直观的排序算法之一,其历史可以追溯到古代。然而,现代计算机科学中对插入排序的形式化描述和分析是在 20 20 20 世纪中叶开始的。

  1. 古代: 插入排序的概念可能可以追溯到古代,人们在整理和排序物品时可能会采用类似的方法。例如,根据字母顺序整理书籍或文件。
  2. 1950 1950 1950 年代: 插入排序首次在计算机科学中被正式描述。在早期计算机系统中,人们需要开发简单而有效的排序算法来处理数据。插入排序由此应生,因为它的实现相对简单,适用于早期计算机的硬件和软件限制。
  3. 1960 1960 1960 年代: 插入排序及其变体开始被广泛研究和应用,特别是在早期的编程教育和计算机科学课程中。
  4. 1970 1970 1970 年代至今: 随着计算机硬件和算法研究的发展,插入排序作为一种基本排序算法仍然被广泛使用。虽然它的时间复杂度较高(平均情况下为 O ( n 2 ) O(n^2) O(n2)),但对于小规模数据或部分有序的数据,插入排序仍然是一种简单而有效的选择。

三、处理流程

场景假设:我们需要将下面的无序序列使用插入排序按从小到大进行排序。
workspace.png

  1. 1 1 1 轮插入:默认第 1 1 1 个元素处于已排序区间,取未排序区间中第 1 1 1 个元素(即: 2 2 2)为基准,将元素 2 2 2 插入到已排序区间正确位置

workspace (3).png

  1. 2 2 2 轮插入:取未排序区间中第 1 1 1 个元素(即: 1 1 1)为基准,将元素 1 1 1 插入到已排序区间正确位置

workspace.png

  1. 3 3 3 轮插入:取未排序区间中第 1 1 1 个元素(即: 5 5 5)为基准,将元素 5 5 5 插入到已排序区间正确位置

workspace (1).png

  1. 4 4 4 轮插入:取未排序区间中第 1 1 1 个元素(即: 3 3 3)为基准,将元素 3 3 3 插入到已排序区间正确位置

workspace.png

四、算法实现

void insertionSort(int[] arr) {
    int n = arr.length; // 获取数组长度
    
    // 从第二个元素开始,依次将元素插入到已排序序列中
    for (int i = 1; i < n; i++) {
        int key = arr[i]; // 当前待插入的元素
        int j = i - 1; // 已排序序列的最后一个元素的索引

        // 从已排序序列的最后一个元素开始,向前遍历
        // 如果已排序序列中的元素大于当前待插入的元素,则将该元素向右移动
        // 直到找到合适的插入位置
        while (j >= 0 && arr[j] > key) {
            arr[j + 1] = arr[j]; // 将 arr[j] 向右移动一位
            j--; // 继续向前遍历
        }
        arr[j + 1] = key; // 将当前待插入的元素插入到合适的位置
    }
}

算法时间复杂度分析:

情况时间复杂度计算公式公式解释
最好情况 O ( n ) O(n) O(n) T ( n ) = n = O ( n ) T(n) = n = O(n) T(n)=n=O(n)当输入的数据已经是有序的(升序或降序),插入排序只需要遍历一次数组,因此最优时间复杂度是 O ( n ) O(n) O(n)
平均情况 O ( n 2 ) O(n^2) O(n2) T ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 = O ( n 2 ) T(n) = \sum_{i = 1}^{n}i = \frac{n(n + 1)}{2} = O(n ^ 2) T(n)=i=1ni=2n(n+1)=O(n2)在平均情况下,插入排序需要比较 n ( n + 1 ) 2 \frac{n(n + 1)}{2} 2n(n+1) 次,因此平均时间复杂度是 O ( n 2 ) O(n^2) O(n2)
最坏情况 O ( n 2 ) O(n^2) O(n2) T ( n ) = ∑ i = 1 n i = n ( n + 1 ) 2 = O ( n 2 ) T(n) = \sum_{i = 1}^{n}i = \frac{n(n + 1)}{2} = O(n ^ 2) T(n)=i=1ni=2n(n+1)=O(n2)当输入的数据是完全逆序的,插入排序需要比较 n ( n + 1 ) 2 \frac{n(n + 1)}{2} 2n(n+1) 次,因此最坏时间复杂度是 O ( n 2 ) O(n^2) O(n2)

五、插入排序的特性

插入排序具有以下特性:

  1. 稳定性: 插入排序是一种稳定的排序算法,即相等元素的相对位置在排序前后保持不变。
  2. 原地性: 插入排序是一种原地排序算法,它只需要常数级别的额外空间来存储少量的辅助变量,而不需要额外的数组空间。
  3. 适用性: 对于小规模数组或部分有序的数组,插入排序是一个简单且高效的排序算法。但在处理大规模数据集时,插入排序的性能通常不如快速排序、归并排序等高级排序算法。

推荐阅读

  1. Spring 三级缓存
  2. 深入了解 MyBatis 插件:定制化你的持久层框架
  3. Zookeeper 注册中心:单机部署
  4. 【JavaScript】探索 JavaScript 中的解构赋值
  5. 深入理解 JavaScript 中的 Promise、async 和 await

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复已删除的文件(简单5 分钟方法)

本文介绍如何使用文件恢复程序恢复已删除的文件。其中包括与恢复已删除文件相关的提示。 如何恢复已删除的文件 从硬盘中恢复已删除的文件并不是一件疯狂的事情&#xff0c;但一旦意识到文件已被删除&#xff0c;尝试恢复会有所帮助。被删除的文件通常直到被其他文件覆盖后才真…

如何在Python中向Word文档添加段落

如何在Python中向Word文档添加段落 添加段落代码解析添加前与添加后 在这篇博客文章中&#xff0c;我们使用Python向Word文档添加段落。 添加段落 from docx import Document# 打开一个现有的Word文档 doc Document(rC:\Users\Administrator\Desktop\Word文档\example.docx)…

02Linux文件,目录,过滤,管道常用命令

Linux基础概述 Linux基础目录 Linux没有盘符这个概念, 只有一个顶级根目录 /, 所有文件都在它下面 在Windows系统中路径之间的层级关系使用/来表示在Linux系统中路径之间的层级关系使用/来表示,出现在开头的/表示根目录, /home/a.txt表示根目录下的home文件夹内有a.txt文件 …

Python中__面向对象__学习 (上)

目录 一、类和对象 1.类的定义 2.根据对象创建类 二、构造和析构 1.构造方法 &#xff08;1&#xff09;不带参数的构造方法 &#xff08;2&#xff09;带参数的构造方法 2.析构方法 三、重载 1.定制对象的字符串形式 &#xff08;1&#xff09;只重载__str__方法 …

STM32 HAL库开发——入门篇(3):OLED、LCD

源自正点原子视频教程&#xff1a; 【正点原子】手把手教你学STM32 HAL库开发全集【真人出镜】STM32入门教学视频教程 单片机 嵌入式_哔哩哔哩_bilibili 一、OLED 二、内存保护&#xff08;MPU&#xff09;实验 2.1 内存保护单元 三、LCD 3.1 显示屏分类 3.2 LCD简介 3.3 LCD…

【JAVASE】日期与时间类(上)

一&#xff1a;概述 从JAVA SE 8开始提供了java.time包&#xff0c;该包中有专门处理日期和时间的类。 LocalDate LocalDateTime 和LocalTime 类的对象封装和日期、时间有关的数据&#xff0c;这三个类都是final类&#xff0c;而且不提供修改数据的方法&#xff0c;即这…

ai辅助教育孩子

孩子经常躺在床上看手机是一个需要关注的问题&#xff0c;因为这不仅可能影响他们的视力健康&#xff0c;还可能影响睡眠质量和身体健康。以下是一些建议&#xff0c;帮助应对这一问题&#xff1a; 设定明确的规定&#xff1a; 与孩子一起制定使用手机的规则&#xff0c;如每天…

前端多人项目开发中,如何保证CSS样式不冲突?

在前端项目开发中&#xff0c;例如突然来了一个大项目&#xff0c;很可能就需要多人一起开发&#xff0c;领导说了&#xff0c;要快&#xff0c;要快&#xff0c;要快&#xff0c;你们给我快。然后下面大伙就一拥而上&#xff0c;干着干着发现&#xff0c;一更新代码&#xff0…

LiDAR360MLS 7.2.0 雷达点云数据处理软件功能介绍

新增模块和功能: 支持手持、背包数据的解算 SLAM解算成功率提升 SLAM解算效率提升 采集端与后处理端保持一致 赋色优化 新增平面图模块 新增平面图全自动矢量化功能 新增平面图矢量一键导出DXF功能 新增平面图正射影像一键导出功能 支持交叉、垂直绘制 支…

添加west扩展命令

使用west工具的帮助命令&#xff0c;west -h&#xff0c;不仅可以列出west工具的内置命令&#xff0c;也可以列举当前工程中实现的扩展命令&#xff0c;如build&#xff0c;flash等。 本文将介绍如何添加扩展命令。 west扩展命令的位置通过以下方式查找&#xff1a; 1. 首先找…

python-自幂数判断

[题目描述]&#xff1a; 自幂数是指&#xff0c;一个N 位数&#xff0c;满足各位数字N 次方之和是本身。例如&#xff0c;153153 是 33 位数&#xff0c;其每位数的 33 次方之和&#xff0c;135333153135333153&#xff0c;因此 153153 是自幂数&#xff1b;16341634 是 44 位数…

react的自定义组件

// 自定义组件(首字母必须大写) function Button() {return <button>click me</button>; } const Button1()>{return <button>click me1</button>; }// 使用组件 function App() {return (<div className"App">{/* // 自闭和引用自…

Springboot 通过SSE 实现实时消息返回

网上搜了好多都是用 SseEmitter 实现的,自己搭的demo确实也可以了,但是我项目里有一个过滤器,死活配置都不行,终于用google搜了一下,第一篇帖子便解决了这个问题,代码和大佬链接如下: https://github.com/CodingChaozhang/spring_boot_practice_demo/blob/master/springboot_s…

基于电荷的EPFL HEMT模型

来源&#xff1a;Charge-Based EPFL HEMT Model&#xff08;TED 19年&#xff09; 摘要 本文介绍了一种面向设计的、基于电荷的模型&#xff0c;用于直流操作下的AlGaAs/GaAs和AlGaN/GaN高迁移率场效应晶体管。该固有模型基于物理原理&#xff0c;不引入任何经验参数。核心概…

vuInhub靶场实战系列--prime:2

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 nmap主机扫描2.1.3 arp-scan主机扫描 2.2 端口扫描…

Hadoop+Spark大数据技术 实验11 Spark 图

17周期末考试 重点从第五章 scala语言开始 比如&#xff1a;映射&#xff08;匿名函数&#xff09; 11.3.1创建属性图 import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD //创建一个顶点集的RDD val users: RDD[(VertexId ,(String,String))] sc.paralle…

技术管理之巅—如何从零打造高质效互联网技术团队阅读体验

技术管理之巅—如何从零打造高质效互联网技术团队 《技术管理之巅&#xff1a;如何从零打造高质效互联网技术团队》是黄哲铿所著的一本书&#xff0c;致力于帮助技术管理者从零开始打造高效的互联网技术团队。该书分为多个章节&#xff0c;分别探讨了从团队文化建设到技术架构…

leetcode 所有可能的路径(图的遍历)

leetcode 链接&#xff1a; 所有可能的路径 1 图的基本概念 1.1 有向图和无向图 左边是有向图&#xff0c;右边是无向图。对于无向图来说&#xff0c;图中的边没有方向&#xff0c;两个节点之间只可能存在一条边&#xff0c;比如 0 和 1 之间的边&#xff0c;因为是无向图&am…

Virtualbox 安装 ubuntu + qemu

0. 前言 关于 Virualbox 安装虚拟机的优秀文章太多了&#xff0c;笔者主要是着重梳理一些安装小细节&#xff0c;利己利人&#xff01;&#xff01; 如果需要保姆式的安装教程&#xff0c;可以查看后续的参考链接。 1. VirtualBox 的安装 直接去官网搜索最近的软件即可&…

汇编:头文件

汇编头文件&#xff08;header files&#xff09;在汇编语言编程中类似于高层语言中的头文件&#xff0c;它们通常包含宏定义、常量定义、数据结构定义、函数声明以及其他在多个汇编源文件中共享的代码&#xff1b;使用头文件可以提高代码的可维护性和可读性&#xff0c;并使代…