【算法-插入排序】基础知识,代码示例和应用场景

插入排序是一种相对简单、直观的排序算法,有点类似打扑克牌时将一张张牌“插入”到合适位置的过程。虽然插入排序的效率不如高级排序算法,但它有自己独特的优点,尤其在小数据集或已部分有序的数据中表现出色。


什么是插入排序

插入排序是一种逐步构建有序列表的算法。它将数组分成“已排序部分”和“未排序部分”,然后从未排序部分中挑选元素插入到已排序部分的合适位置。想象打扑克牌时,一张张将牌放在手中按照大小排好,就是插入排序的过程。

插入排序的操作过程

插入排序

假设有一个无序的数组 [8, 4, 3, 7, 6],我们用插入排序把它从小到大排序。

  1. 第一步

    • 假设第一个元素 [8] 已经有序。
    • 从第二个元素开始 [4],插入到 [8] 之前。
    • 结果为 [4, 8, 3, 7, 6]
  2. 第二步

    • 将第三个元素 [3] 插入到 [4, 8] 中。
    • [3][4] 小,放到最前面。
    • 结果为 [3, 4, 8, 7, 6]
  3. 第三步

    • 将第四个元素 [7] 插入到 [3, 4, 8] 中。
    • [7][4] 大,但比 [8] 小,因此插入到 [8] 之前。
    • 结果为 [3, 4, 7, 8, 6]
  4. 第四步

    • 将第五个元素 [6] 插入到 [3, 4, 7, 8] 中。
    • [6][7] 小,所以插入到 [7] 之前。
    • 最终结果为 [3, 4, 6, 7, 8]

通过这样一轮轮的插入,数组逐渐变得有序。


插入排序的代码实现

下面是插入排序的 Java 代码实现,每一步都附带注释,方便理解。

public class InsertionSort {public static void insertionSort(int[] arr) {// 从第二个元素开始逐个插入for (int i = 1; i < arr.length; i++) {int current = arr[i];int j = i - 1;// 向左扫描已排序部分,找到插入位置while (j >= 0 && arr[j] > current) {arr[j + 1] = arr[j]; // 向右移动元素j--;}// 把当前元素插入到合适位置arr[j + 1] = current;}}public static void main(String[] args) {int[] arr = {8, 4, 3, 7, 6};insertionSort(arr);System.out.println(Arrays.toString(arr));}
}

代码运行过程

对于数组 [8, 4, 3, 7, 6],代码运行时会执行以下操作:

  • 第一次循环,i = 1,将 4 插入到 8 前面。
  • 第二次循环,i = 2,将 3 插入到 4 前面。
  • 第三次循环,i = 3,将 7 插入到 8 前面。
  • 第四次循环,i = 4,将 6 插入到 8 前面。

这样一轮轮下来,最终输出的是 [3, 4, 6, 7, 8]


插入排序的时间复杂度

插入排序的时间复杂度取决于数据的有序程度:

  • 最佳情况:当数组已经有序时,插入排序只需逐一比较,无需移动元素,时间复杂度为 (O(n))。
  • 最差情况:当数组完全逆序时,每个元素都需要比较和移动,时间复杂度为 (O(n^2))。
  • 平均情况:在一般随机数据下,插入排序的时间复杂度为 (O(n^2))。

由于其时间复杂度,插入排序并不适合处理大规模数据,但在小数据集或近似有序的场景下表现不错。


插入排序的适用场景

  1. 小型数据集:对于数量较少的数据(如几十个元素),插入排序的性能较好,足以胜任排序任务。
  2. 部分有序的数组:如果数组大部分是有序的,插入排序会比其他复杂排序算法更有效率,因为它不需要做太多的移动。
  3. 实时数据插入:在不断插入数据并保持有序的场景下,插入排序的特性十分适合,比如插入排序在链表的排序上应用较多。

插入排序的优缺点

优点
  1. 简单易懂:算法逻辑清晰、容易实现,适合初学者掌握。
  2. 稳定性:插入排序是稳定的排序算法,相等的元素不会交换位置。
  3. 在线排序:能够实现实时插入,即在排序过程中可以逐步添加新元素,并将其插入到合适的位置。
缺点
  1. 效率较低:当数据规模增大时,插入排序的时间复杂度为 (O(n^2)),处理大数据时性能较差。
  2. 不适合逆序排序:当数据逆序或接近逆序时,插入排序需要更多的移动操作,因此效率不佳。

插入排序的实际应用

插入排序在很多实际情况下有用,比如:

  1. 少量数据排序:对于小数据量的情况(例如少于 100 个元素),插入排序的效率可以和高级排序算法媲美。
  2. 排序链表:插入排序在链表中应用广泛,因为在链表中插入元素时效率较高。
  3. 基本有序的数据:当数据大致有序,或者需要不断插入新数据并保持有序时,插入排序的性能表现良好。

插入排序的总结

插入排序是一种操作简单、适合初学者学习的排序算法。它的特点是在小规模数据或基本有序的情况下性能较好,且插入时不需要额外空间。虽然插入排序的效率不如高级排序算法,但在某些应用场景中仍然具有实际价值。

希望通过本章的学习,能够帮助大家更好地理解插入排序的基本原理、适用场景和代码实现。在掌握插入排序后,可以继续学习其他更复杂的排序算法,提升数据处理效率。

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

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

相关文章

共享汽车管理新纪元:SpringBoot框架应用

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

yaml文件编写

Kubernetes 支持YAML和JSON格式管理资源 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式;用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化容易读懂 一&#xff0c;yaml语法格式 1.1 基本语法规则 使用空格进行缩进&#xff08;不使用制表符&#xff0…

ssm071北京集联软件科技有限公司信息管理系统+jsp(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;北京集联软件科技有限公司信息管理系统 \ 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本信息…

满足大众需求的理想选择:1000平米气膜羽毛球馆—轻空间

随着全民健身热潮的兴起和羽毛球运动的广泛普及&#xff0c;越来越多的企事业单位、学校以及社区开始寻求适合的大型羽毛球场地。对于大众需求者而言&#xff0c;如何在有限的预算和时间内建设一个高效且灵活的羽毛球馆&#xff1f;1000平米气膜羽毛球馆正是应运而生的理想解决…

原生鸿蒙应用市场:赋能开发者全生命周期服务体验

文章目录 背景自动化检测前移&#xff1a;早发现&#xff0c;早解决技术细节&#xff1a;静态代码分析与兼容性测试应用场景 按需加载&#xff1a;优化性能&#xff0c;提升用户体验技术细节&#xff1a;模块化与懒加载实现应用场景 应用加密&#xff1a;保护应用代码安全&…

vue3组合式API下封装hooks使用生命周期,在await之后调用hooks会有警告

起因&#xff1a;想封装一个hooks实现echarts图表随屏幕大小resize并且组件销毁时移除监听。结果在组件里面调用这个hooks&#xff0c;有个告警提示 [Vue warn]: onBeforeUnmount is called when there is no active component instance to be associated with. Lifecycle inje…

wget命令之Tomcat(三)

引言 Tomcat是一个开源的Java Web应用服务器&#xff0c;实现了多个关键的Java EE规范&#xff0c;包括Servlet、JSP&#xff08;JavaServer Pages&#xff09;、JavaWebSocket等。由于Tomcat技术先进、性能稳定且免费&#xff0c;它成为了许多企业和开发者的首选Web应用服务器…

【机器学习】决定系数(R²:Coefficient of Determination)

决定系数&#xff0c;也称为 R 平方&#xff0c;是一种用于衡量回归模型预测效果的统计指标。它表示了模型解释目标变量总变异的程度&#xff0c;数值介于 0 和 1 之间&#xff0c;数值越接近 1 表明模型的解释力越强。 1. 的定义和公式 的公式如下&#xff1a; 其中&#xf…

Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

代码地址 https://github.com/junjie18/CMT 1. 引言 在本文中&#xff0c;我们提出了Cross-Modal Transformer&#xff08;CMT&#xff09;&#xff0c;这是一种简单而有效的端到端管道&#xff0c;用于鲁棒的3D对象检测&#xff08;见图1&#xff08;c&#xff09;&#xf…

十四、Linux线程(一)

1.守护进程 1.守护进程的特点 是后台服务进程 独立于控制终端 周期性执行某任务 不受用户登录注销影响 一般采用以d结尾的名字&#xff08;服务&#xff09; 2.进程组 进程的组长&#xff1a; 组里边的第一进程 进程组的ID进程中的组长的ID 进程中组长的选择&#xff1…

多模态数字人AI产品正在革新金融业,解密头部银行、证券公司都在用的AI工具

在人工智能迅猛发展的时代背景下&#xff0c;金融业正迎来一场深刻的变革。 多模态的人工智能&#xff0c;以其独特的魅力&#xff0c;正在重塑金融行业的格局&#xff0c;为金融服务带来前所未有的新想象。从今年以来行业对AI技术的探索与实践中&#xff0c;AIGC 3D数字人多模…

多态性核SSR的鉴定

多态性核SSR的鉴定 文章目录 多态性核SSR的鉴定前言一、使用bwa对测序数据进行mapping二、使用SOAPdenovo2对核序列进行从头组装成scaffolds三、使用CandiSSR寻找多态性核SSR3.1. 安装CandiSSR软件的准备3.2. 运行CandiSSR时的准备3.3. 整理得到的结果文件 四、统计Contig的数量…

【AIGC探索】AI实现PPT生产全流程

AI实现PPT生产流程 简单概括流程就是&#xff1a; 选择用百度文库AI生成PPT&#xff0c;使用WPS和islide辅助美化&#xff0c;使用文字大模型生成大纲&#xff0c;使用宏指令快速规范细节。 理由如下&#xff1a; 大多数PPT工具生成大纲会有文字篇幅限制&#xff0c;通过大模型…

鸿蒙ArkTS中的获取网络数据

一、通过web组件加载网页 在C/S应用程序中&#xff0c;都有网络组件用于加载网页&#xff0c;鸿蒙ArkTS中也有类似的组件。   web组件&#xff0c;用于加载指定的网页&#xff0c;里面有很多的方法可以调用&#xff0c;虽然现在用得比较少&#xff0c;了解还是必须的。   演…

数学建模(基于Python实现)--灰色关联分析法讲解,含案例

前言 这是去年底学数学建模老哥的建模课程笔记&#xff1b; 未来本人将陆陆续续的更新数学建模相关的一些基础算法&#xff0c;大家可以持续关注一下&#xff0c;主要在于运用&#xff1b; 提示&#xff1a;数学建模只有实战才能提升&#x1f525;​&#x1f525;​&#x1f…

【go从零单排】error错误处理及封装

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 在 Go 语言中&#xff0c;error 是一个内置的接口类型&#xff0c;用于表示错误情…

论文阅读笔记:Depth Pro: Sharp Monocular Metric Depth in Less Than a Second

论文阅读笔记&#xff1a;Depth Pro: Sharp Monocular Metric Depth in Less Than a Second 1 背景1.1 动机1.2 提出的方法 2 创新点3 方法4 模块4.1 训练目标4.2 课程训练 4.3 边缘评价指标4.4 焦距估计 5 效果5.1 和SOTA方法的对比 论文&#xff1a;https://arxiv.org/abs/24…

flutter 项目初建碰到的控制台报错无法启动问题

在第一次运行flutter时&#xff0c;会碰见一直卡在Runing Gradle task assembleDebug的问题。其实出现这个问题的原因有两个。 一&#xff1a;如果你flutter -doctor 检测都很ok&#xff0c;而且环境配置都很正确&#xff0c;那么大概率就是需要多等一会&#xff0c;少则几十分…

跨子网的WinCC客户机/服务器如何实现通讯?

为了更有效地利用有限的IP地址&#xff0c;为了减少广播对网络带宽的占用从而提高带宽&#xff0c;为了实现在不同子网中应用不同的安全策略从而提高网络安全性&#xff0c;现场通常要求划分子网&#xff0c;将安全等级要求不同的计算机安置在不同的子网中&#xff0c;分开管理…

SpringClud一站式学习之Eureka服务治理(二)

SpringClud一站式学习之Eureka服务治理 引言1. 搭建Eureka Server1.1. 添加Eureka Server依赖1.2. 添加 Eureka Server注解1.3. 配置Eureka Server1.4. 运行Eureka Server 2. 搭建Eureka Client 服务提供者2.1. 添加依赖2.2. 添加注解2.3. 配置Eureka Client2.4. 启动服务 3. 搭…