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

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


什么是插入排序

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

插入排序的操作过程

插入排序

假设有一个无序的数组 [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.mzph.cn/news/885282.shtml

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

相关文章

大数据学习10之Hive高级

1.Hive高级 将大的文件按照某一列属性进行GROUP BY 就是分区&#xff0c;只是默认开窗存储&#xff1b; 分区是按行&#xff0c;如一百行数据&#xff0c;按十位上的数字分区&#xff0c;则有十个分区&#xff0c;每个分区里有十行&#xff1b; 分桶是根据某个字段哈希对桶数取…

Me-LLaMA——用于医疗领域的新型开源大规模语言模型

摘要 大规模语言模型的出现是提高病人护理质量和临床操作效率的一个重大突破。大规模语言模型拥有数百亿个参数&#xff0c;通过海量文本数据训练而成&#xff0c;能够生成类似人类的反应并执行复杂的任务。这在改进临床文档、提高诊断准确性和管理病人护理方面显示出巨大的潜…

练习LabVIEW第四十四题

学习目标&#xff1a; 计算学生三门课(语文&#xff0c;数学&#xff0c;英语)的平均分&#xff0c;并根据平均分划分成绩等级。要求输出等级A,B,C,D,E。90分以上为A&#xff0c;80&#xff5e;89为B&#xff0c;70&#xff5e;79为C&#xff0c;60&#xff5e;69为D&#xff…

重建大师7.0 | 全新倾斜高斯泼溅OPGS技术,实景三维大规模城市三维场景的更逼真化表达

在刚刚结束的“AI智算、国产信创”2024秋季新品发布会上&#xff0c;大势智慧隆重发布了重建大师7.0、重建农场信创版、低空三维AI智算平台等覆盖实景三维数据生产体系全流程、推进实景三维国产化建设与低空应用的全新系列产品。 今天&#xff0c;重点为大家介绍一下重建大师7.…

【MySQL 保姆级教学】深层理解索引及特性(重点)--下(12)

索引&#xff08;重点&#xff09; 1. 索引的作用2. 索引操作2.1 主键索引2.1.1 主键索引的特点2.1.2 创建主键索引 2.2 唯一键索引2.2.1 唯一键索引的特点2.2.2 唯一索引的创建 2.3 普通索引2.3.1 普通索引的特点2.3.2 普通索引的创建 2.4 全文索引2.4.1 全文索引的作用2.4.2 …

力扣: 144 二叉树 -- 先序遍历

二叉树 – 先序遍历 描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例&#xff1a; 先序遍历&#xff1a;根左右 何解&#xff1f; 1、递归 : 无需多言一看就懂 2、遍历法 中序查找时&#xff0c;最先出入的节点是左子树中的最左侧二叉…

【K8S系列】K8S 集群 CPU 爆满导致 Pod Pending 状态的分析与解决方案

在 Kubernetes 集群中&#xff0c;CPU 突然爆满可能导致 Pod 状态变为 Pending&#xff0c;影响应用的可用性。本文将深入分析其原因&#xff0c;并附上相关命令及其执行结果&#xff0c;帮助你更好地理解和解决此问题。 1. 问题描述 在 Kubernetes 集群中&#xff0c;当 CPU …

Linux awk命令详解-参数-选项-内置变量-内置函数-脚本(多图、多示例)

文章目录 awk基础结构说明与示例参数与内置变量常用参数内置变量其他参数内置变量 简单示例理解option简单参数NR与FNR-v ARGC ARGV参数 执行脚本if elsefor循环关联数组指定匹配pattern 使用正则指定分隔符理解pattern正则与逻辑算术 printfif else for whileBEGIN ENDnext(跳…

【Android】组件化开发入门

文章目录 引入组件是什么?为什么使用组件化开发?什么是模块化&#xff0c;组件化&#xff0c;插件化&#xff1f;常见实现 组件分层创建module 组件单独调试配置组件工程类型配置组件ApplicationId和AndroidManifest文件 引入 组件是什么? 组件&#xff08;Component&#…

MySQL数据库基础(一) MySQL安装及数据类型

目录 一、MySQL数据裤简介 二、MySQL数据的安装 2.1、MySQL安装 2.2、修改MySQL密码登录策略 三、数据库基础管理 3.1、连接方式及数据储存流程 3.2、库管理命令 3.3、表管理命令 3.4、记录管理命令 四、MySQL数据类型 4.1、常见信息种类 4.2、字符型 4.3、数值型 4.4、日期时间…

云原生+AI核心技术&最佳实践

以下内容是我在陕西理工大学2023级人工智能专业和网络专业的演讲内容&#xff0c;分享给大家。 各位老师、同学们&#xff0c;大家好啊&#xff01;能在这里跟大家一起聊聊咱们计算机专业那些事儿&#xff0c;我真的觉得超级兴奋&#xff01; 首先&#xff0c;自我介绍一下&am…

Qt QCustomplot 在采集信号领域的应用

文章目录 一、常用的几种开源库:1、QCustomPlot:2、QChart:3、Qwt:QCustomplot 在采集信号领域的应用1、应用实例时域分析频谱分析2.数据筛选和处理其他参考自然界中的物理过程、传感器和传感器网络、电路和电子设备、通信系统等都是模拟信号的来源。通过可视化模拟信号,可以…

C++11的简介

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 一列表初始化的变化&#xff1a; 二左右值即各自引用的概念&#xff1a; 2.1左右…

大模型的常用指令格式 --> ShareGPT 和 Alpaca (以 llama-factory 里的设置为例)

ShareGPT 格式 提出背景&#xff1a;ShareGPT 格式起初来自于用户在社交平台上分享与聊天模型的对话记录&#xff0c;这些记录涵盖了丰富的多轮对话内容。研究者们意识到&#xff0c;这类真实的对话数据可以帮助模型更好地学习多轮对话的上下文保持、回应生成等能力。因此&…

5G时代已来:我们该如何迎接超高速网络?

内容概要 随着5G技术的普及&#xff0c;我们的生活似乎变得更加“科幻”了。想象一下&#xff0c;未来的智能家居将不仅仅是能够听你说“开灯”&#xff1b;它们可能会主动询问你今天心情如何&#xff0c;甚至会推荐你一杯“维他命C芒果榨汁”&#xff0c;帮助你抵御夏天的炎热…

Unity SRP学习笔记(二)

Unity SRP学习笔记&#xff08;二&#xff09; 主要参考&#xff1a; https://catlikecoding.com/unity/tutorials/custom-srp/ https://docs.unity.cn/cn/2022.3/ScriptReference/index.html 中文教程部分参考&#xff08;可选&#xff09;&#xff1a; https://tuncle.blog/c…

【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期

目录 1. start() (1) start() 的性质 (2) start() 和 Thread类 的关系 2. 终止一个线程 (1)通过共享的标记结束线程 1. 通过共享的标记结束线程 2. 关于 lamda 表达式的“变量捕获” (2) 调用interrupt()方法 1. isInterrupted() 2. currentThread() …

粤荣学校与亲邻家政达成合作,创造双向人才输送机制

原标题&#xff1a;超过大学生月薪&#xff01;粤荣学校与亲邻家政达成合作&#xff0c;创造双向人才输送机制&#xff0c;解决中年人就业难题&#xff01; 广州市白云区粤荣职业培训学校余智强校长与广州亲邻家政服务有限公司朱利生经理于2024年11月8日下午共同签署了一份重要…

【MacOS实操】如何基于SSH连接远程linux服务器

MacOS上远程连接linux服务器&#xff0c;可以使用ssh命令pem秘钥文件连接。 一、准备pem秘钥文件 如果已经有pem文件&#xff0c;则跳过这一步。如果手上有ppk文件&#xff0c;那么需要先转换为pem文件。 macOS 的默认 SSH 客户端不支持 PPK 格式&#xff0c;你需要将 PPK 文…

parseInt 是一个内置的 JavaScript 函数,用于将字符串转换为整数。

parseInt(options.checkNumber, 10) 中的 10 表示将字符串转换为十进制整数。 解释 parseInt 函数&#xff1a; parseInt 是一个内置的 JavaScript 函数&#xff0c;用于将字符串转换为整数。它有两个参数&#xff1a; 第一个参数是要转换的字符串。第二个参数是转换时使用的基…