排序算法之插入排序篇

插入排序

在这里插入图片描述

思路:

就是将没有排序的元素逐步地插入到已经排好序的元素后面,保持元素的有序

视频的实现过程如下:

插入排序全过程

代码实现过程如下:

public static void Insertion(int[] arr) {  for (int i = 1; i < arr.length; i++) {  // 从第二个元素开始  int key = arr[i];  // 当前要插入的元素  int j = i - 1;  // 已排序部分的最后一个位置  // 将已排序部分大于key的元素向右移  while (j >= 0 && arr[j] > key) {  arr[j + 1] = arr[j];  // 向右移动元素  j--;  // 继续往左移动  }  // 将key插入到正确的位置  arr[j + 1] = key;  }  
}

在这里插入图片描述

时间复杂度:

插入排序的时间复杂度其实分为最坏情况最好情况平均情况

1. 最坏情况(Worst Case)

最坏的情况发生在数组是逆序的情况下。也就是说,数组中的每一个元素都比它前面的元素大。

  • 假设我们有一个数组 [5, 4, 3, 2, 1],它完全是逆序的。
  • 对于每个元素,插入排序都需要将它和前面所有的元素比较,直到它被插入到最前面。

对于第一个元素,已经是排序好了的,所以不需要比较。

  • 对第二个元素,4,需要比较一次(和 5 比较),然后把它插入到第一个位置。
  • 对第三个元素,3,需要和前面的 54 都比较,再把它插入到第三个位置。
  • 对第四个元素,2,需要和前面的三个元素 543 都比较,再插入到第四个位置。
  • 对最后一个元素,1,需要和前面所有四个元素比较,再插入到最前面。

这种情况,每个元素的比较次数逐渐增多,总的比较次数大约是:

  • 第一个元素比较 0 次
  • 第二个元素比较 1 次
  • 第三个元素比较 2 次
  • 第n个元素比较 n-1 次

因此,比较的总次数是:
[
0 + 1 + 2 + … + (n-1) = \frac{n(n-1)}{2}
]
这就是二次方的增长,所以最坏情况下的时间复杂度是:O(n^2)

2. 最好情况(Best Case)

最好情况发生在数组本身已经是有序的情况下。即所有的元素已经在正确的位置,不需要任何交换。

  • 假设我们有一个数组 [1, 2, 3, 4, 5]
  • 对于每一个元素,它已经在排序好的部分中,所以每次插入时都只需要比较一次,发现它的位置已经正确,无需做交换。

所以对于每个元素,只需要进行一次比较,总的时间复杂度就是O(n),即线性时间。

3. 平均情况(Average Case)

平均情况就是假设数据是随机的,每个元素大约需要和一半的已排序部分比较。

每个元素平均需要比较 n/2 次。因为是随机的情况,所以比较的次数大致是:
[
\frac{n}{2} \times n = O(n^2)
]
所以,平均情况下,插入排序的时间复杂度也是O(n^2)

总结:

  • 最坏情况:O(n^2)(数组逆序时)
  • 最好情况:O(n)(数组已排序时)
  • 平均情况:O(n^2)(随机排列的情况)

因此,虽然插入排序在最好的情况下效率较高,但在大多数情况下,它的时间复杂度是 O(n^2),这使得它在处理大规模数据时不太高效。

如果数组已经基本排好序或者只有少量元素需要调整,插入排序还是一个不错的选择,因为它的空间复杂度是 O(1),即它不需要额外的空间来存储临时数据。

在这里插入图片描述

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

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

相关文章

【机器学习】支持向量机SVR、SVC分析简明教程

关于使用SVM进行回归分析的介绍很少&#xff0c;在这里&#xff0c;我们讨论一下SVR的理论知识&#xff0c;并对该方法有一个简明的理解。 1. SVC简单介绍 SVR全称是support vector regression&#xff0c;是SVM&#xff08;支持向量机support vector machine&#xff09;对回…

SpringMVC-08-json

8. Json 8.1. 什么是Json JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式&#xff0c;目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写&#xf…

APM32使用I2C驱动OLED

实验效果 本次实验主要讲APM32的I2C外设的初始化和APM32作为主机如何发送数据&#xff0c;OLED的驱动写起来较难本次实验不涉及。由于条件有限本次只能讲主机发送&#xff0c;接收也没有涉及。 硬件原理图 源代码 I2C初始化部分 #ifndef __BSP__IIC_H__ #define __BSP__IIC_…

QT布局详解

ui设计器设计界面很方便&#xff0c;为什么还要手写代码? (1)更好的控制布局 (2)更好的设置qss (3)代码复用 创建水平布局 包含头文件 #include<QHBoxLayout> 创建水平布局QHBoxLayout *pHLay new QHBoxLayout(父窗口指针);//一般填this QPushButton *pBtn1 n…

宏集eXware物联网网关在水务管理系统上的应用

一、前言 水务管理系统涵盖了对城市水网、供水、排水、污水处理等多个环节的监控与管理。随着物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;物联网网关逐渐成为水务管理系统中的关键组成部分。 宏集物联网网关以其高效的数据采集、传输和管理功能&#xff0c…

不修改内核镜像的情况下,使用内核模块实现高效监控调度时延

一、背景 在之前的博客 调度时延的观测_csdn 调度时延的观测 杰克崔-CSDN博客 里&#xff0c;我们讲了多种监控调度时延的方法&#xff0c;有依靠系统现有节点来监控&#xff0c;但是依赖系统现有节点做不到每个单词调度时延的监控&#xff0c;也讲了通过修改内核代码&#xf…

在 ASP.NET C# Web API 中实现 Serilog 以增强请求和响应的日志记录

介绍 日志记录是任何 Web 应用程序的关键方面。它有助于调试、性能监控和了解用户交互。在 ASP.NET C# 中&#xff0c;集成 Serilog 作为记录请求和响应&#xff08;包括传入和传出的数据&#xff09;的中间件可以显著提高 Web API 的可观察性和故障排除能力。 在过去的几周里&…

【开源免费】基于Vue和SpringBoot的技术交流分享平台(附论文)

博主说明&#xff1a;本文项目编号 T 053 &#xff0c;文末自助获取源码 \color{red}{T053&#xff0c;文末自助获取源码} T053&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

JVM指令集概览:基础与应用

写在文章开头 在现代软件开发中,Java 语言凭借其“一次编写,到处运行”的理念成为了企业级应用的首选之一。这一理念的背后支撑技术正是 Java 虚拟机(JVM)。JVM 是一个抽象的计算机,它实现了 Java 编程语言的各种特性,并且能够执行编译后的字节码文件。了解 JVM 的工作原…

电子应用设计方案-33:智能AI投影仪系统方案设计

智能 AI 投影仪系统方案设计 一、引言 随着科技的不断进步&#xff0c;投影仪在家庭娱乐、商务办公和教育培训等领域的应用越来越广泛。智能 AI 投影仪作为一种创新的投影设备&#xff0c;结合了人工智能技术&#xff0c;为用户带来更便捷、智能和个性化的使用体验。 二、系统…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性&#xff1a;技术背景 本企业网站在Windows操作系统中进行开发&#xff0c;并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

SQL进阶——C++与SQL进阶实践

在C开发中&#xff0c;SQL数据库的操作是开发者常见的任务之一。虽然前面我们已经介绍了如何在C中通过数据库连接执行基本的SQL查询&#xff0c;但在实际项目中&#xff0c;我们通常需要更加复杂和高效的数据库操作。存储过程与函数的调用、复杂SQL查询的编写、以及动态构造SQL…

Spring Boot日志总结

文章目录 1.我们的日志2.日志的作用3.使用日志对象打印日志4.日志框架介绍5.深入理解门面模式(外观模式)6.日志格式的说明7.日志级别7.1日志级别分类7.2配置文件添加日志级别 8.日志持久化9.日志文件的拆分9.1官方文档9.2IDEA演示文件分割 10.日志格式的配置11.更简单的日志输入…

CSDN设置成黑色背景(谷歌 Edge)

一.谷歌浏览器 浏览器地址输入&#xff1a;Chrome://flags搜索框输入&#xff1a;enable-force-dark将default 改成 enabled&#xff0c;点击重启浏览器 二.Edge浏览器 浏览器地址输入&#xff1a;edge://flags搜索里面输入Auto Dark Mode for Web Contents将default 改成 e…

实现PDF文档加密,访问需要密码

01. 背景 今天下午老板神秘兮兮的来问我&#xff0c;能不能做个文档加密功能&#xff0c;就是那种用户下载打开需要密码才能打开的那种效果。boss都发话了&#xff0c;那必须可以。 需求&#xff1a;将pdf文档经过加密处理&#xff0c;客户下载pdf文档&#xff0c;打开文档需要…

Android内容提供者

一、ContentProvider 实现跨程序共享数据 创建内容提供者&#xff1a;extends ContentProvider类 访问数据 Uri uri Uri.parse("uri路径") 查询数据 ContentResolver resolver context.getContentResolver(); Cursor cur resolver.query(Uri,projection,sel…

基于JSP+MySQL的网上招聘系统的设计与实现

摘要 在这样一个经济飞速发展的时代&#xff0c;人们的生存与生活问题已成为当代社会需要关注的一个焦点。对于一个刚刚 踏入社会的年轻人来说&#xff0c;他对就业市场和形势了解的不够详细&#xff0c;同时对自己的职业规划也很模糊&#xff0c;这就导致大量的 时间被花费在…

如何全面备份你的Mac电脑:邮件、联系人、桌面文件和Safari书签

在卖掉或更换电脑之前&#xff0c;备份所有重要数据是非常关键的步骤。本文将指导你如何备份MacBook Pro上的邮件、联系人、桌面文件以及Safari的书签。 1. 备份Safari书签 如果你使用Safari浏览器&#xff0c;可以按照以下步骤导出书签&#xff1a; 打开Safari。点击顶部菜…

三维渲染中顺序无关的半透明混合(OIT)(一Depth Peeling)

>本文收集关于透明对象渲染技术中关于OIT技术的资料&#xff0c;尝试用简单的逻辑对这些内容进行整理。 1、透明对象的特殊对待 不要小瞧png图片和jpg图片的差异&#xff01;在一般的三维平台&#xff0c;png代表的是带透明通道的纹理&#xff0c;而jpg代表的是不带透明的…

行业分析---2024年蔚来汽车三季度财报及科技日

1 前言 在之前的博客中&#xff0c;笔者撰写了多篇行业类分析的文章&#xff08;科技新能源&#xff09;&#xff1a; 《行业分析---我眼中的Apple Inc.》 《行业分析---马斯克的Tesla》 《行业分析---造车新势力之蔚来汽车》 《行业分析---造车新势力之小鹏汽车》 《行业分析-…