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

news2025/1/20 3:52:17

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

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

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

文章目录

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

一、插入排序

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

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

  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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【STM32】uc/OS-III多任务程序

目录 一、背景介绍二、UCOS-III简单介绍&#xff08;一&#xff09;源码&#xff08;二&#xff09;功能 三、实验&#xff08;一&#xff09;基于STM32CubeMX建立工程1、创建项目2、配置项目 &#xff08;二&#xff09;实现 四、总结五、参考 一、背景介绍 学习嵌入式实时操…

Flutter 使用ffigen生成ffmpeg的dart接口

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频 第五章 Windows使用Native窗口渲染视频 第六章 桌面端使用texture_rgba_renderer渲染视频 第七章 使用ff…

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

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

重塑状态管理的艺术:Vue3中Pinia的魔法之旅内包含简易购物车案例

前言 在Vue.js的世界里&#xff0c;每一次更新都是一次进化&#xff0c;Vue3携带着更强大的性能与灵活性翩然而至。而在这场技术盛宴中&#xff0c;Pinia以一种优雅而革命性的方式&#xff0c;重新定义了状态管理的体验。如果说Vuex是Vue2时代的王者&#xff0c;那么Pinia无疑…

Attendance Machine (KPI)

Attendance Machine &#xff08;KPI&#xff09; QQ机考勤机数据KPI

YOLOv5改进总目录 | backbone、Neck、head、损失函数,注意力机制上百种改进技巧

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏地址&#xff1a; YOLOv5改进入门——持续更新各种有效涨点方法 点击即可跳转 报错 解决Yolov5的RuntimeError: result type Float can…

spring-kafka-生产者服务搭建测试(SpringBoot整合Kafka)

文章目录 1、生产者服务搭建1.1、引入spring-kafka依赖1.2、application.yml配置----v1版1.3、使用Java代码创建主题分区副本1.4、发送消息 1、生产者服务搭建 1.1、引入spring-kafka依赖 <?xml version"1.0" encoding"UTF-8"?> <project xml…

关于使用XX源码,开始编译的时候报错:不允许使用返回函数的函数

在使用vlc源码&#xff0c;开始编译的时候遇到以下错误&#xff1a; 仔细一看&#xff0c;懵掉了&#xff0c;NND源码编译都有错&#xff1f;报错如下&#xff1a; 一顿查找后&#xff0c;得出解决问题的办法&#xff1a;把ssize_t改为int 在大多数情况下&#xff0c;你可以将…

【Go语言精进之路】构建高效Go程序:了解切片实现原理并高效使用

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 引言一、切片究竟是什么&#xff1f;1.1 基础的创建数组示例1.2 基础的创建切片示例1.3 切片与数组的关系 二、切片的高级特性&#xff1a;动态扩容2.1 使用 append 函数扩容2.2 容量管理与性能考量2.3 切片的截取与缩容 三…

数学建模 —— 层次分析法(2)

目录 一、层次分析法&#xff08;AHP&#xff09; 二、构造比较判断矩阵 2.1 两两比较法 三、单准则下的排序及一致检验 3.1 单准则下的排序 3.2 一致性检验 四、层次总排序 4.1 层次总排序的步骤 4.2 总排序一致性检验 一、层次分析法&#xff08;AHP&#xff09; 方…

RHEL - 订阅、注册系统和 Yum Repository(新版界面)

《OpenShift / RHEL / DevSecOps 汇总目录》 演示环境说明 本文需要有 redhat.com 账号以及包含 RHEL 的有效订阅。 演示环境使用了通过 minimal 方式安装的 RHEL 7.6 环境&#xff0c;RHEL 可以访问互联网。 红帽网站 access.redhat.com 针对新用户提供了新版界面&#xff0…

华为端云一体化开发 初始化云db表结构和表数据(实践2.0)(HarmonyOS学习第七课)

实例介绍&#xff1a;黑马鸿蒙刷题学习过程 1. 静态页面准备 借用黑马完成的页面&#xff0c;已经提供给大家一套写好的基本模板&#xff0c;大家直接将这套模板覆盖原有entry/src/main目录就可以 &#x1f4ce;main.ziphttps://www.yuque.com/attachments/yuque/0/2024/zip…

从零入手人工智能(2)——搭建开发环境

1.前言 作为一名单片机工程师&#xff0c;想要转型到人工智能开发领域的道路确实充满了挑战与未知。记得当我刚开始这段旅程时&#xff0c;心中充满了迷茫和困惑。面对全新的领域&#xff0c;我既不清楚如何入手&#xff0c;也不知道能用人工智能干什么。正是这些迷茫和困惑&a…

切莫被人工智能的洪流吞噬

切莫被人工智能的洪流吞噬 当今社会似乎正在被“人工智能”的概念淹没&#xff0c;各行各业也都期望能与其挂钩&#xff0c;彷佛这就是新世代下的灵药&#xff0c;有人把这一现象称为“旧互联网时代的新革命”。但是我们&#xff0c;这一现象的缔造者&#xff0c;又处于这洪流…

标准价与移动平均价简介

一、移动平均价 移动平均价优点&#xff1a; a.移动平均价格可反应”实时的”加权平均价格,特别是物料价格涨跌幅度大时物料的价格不会被差异扭曲。 b.因为是基于交易的实时加权平均计算价格,一般情况下,移动平均价不产生差异&#xff0c;价格相对真实。 c.如果所有的物料都使用…

calibre,一个超厉害的 Python 库!

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超厉害的 Python 库 - calibre。 Github地址&#xff1a;https://github.com/kovidgoyal/calibre 电子书籍已经成为现代阅读的重要形式&#xff0c;而管理和转换电子书籍格式的需求也随之增加…

[NOVATEK] NT96580行车记录仪功能学习笔记(持续更新~

一、u-Boot升级灯 运行u-Boot程序时LED灯闪烁,找到运行过程中一直在运行的函数在里面进行LED引脚电平的翻转 宏定义 Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\include\configs\nvt-na51055-evb.h Z:\SunFan\AHD580\pip\na51055_PIP\BSP\u-boot\drivers\mtd\nvt_flash_…

weditor安装时提示This is an issue with the package mentioned above, not pip

报错如下&#xff1a; note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with …

【Java】解决Java报错:OutOfMemoryError

文章目录 引言1. 错误详解2. 常见的出错场景2.1 内存泄漏2.2 大数据结构2.3 JVM内存参数配置不当 3. 解决方案3.1 内存泄漏检测与修复3.2 优化数据结构3.3 调整JVM内存参数3.4 使用弱引用 4. 预防措施4.1 定期进行内存分析4.2 合理设计数据结构4.3 使用合适的JVM内存参数4.4 优…

C++11:列表初始化 初始化列表initializer_list decltype关键字

目录 前言 列表初始化 初始化列表initializer_list decltype关键字 左值和右值 move 前言 2003年C标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得C03这个名字取代了C98成为了C11前最新的C标准名称。不过由于C03主要是对C98标准中的…