【算法练习】29:插入排序学习笔记

一、插入排序的算法思想

        原理:将一个无序的数据序列逐步转化为有序序列。算法将待排序的数组分为两个部分已排序部分和未排序部分。

        时间复杂度:插入排序的时间复杂度在最坏、平均和最好情况下的表现相同,均为 O(n^2),其中 n 是待排序数组的长度。这是因为无论输入数组如何分布,插入排序都需要对每个元素进行一次遍历(寻找插入位置),并且在最坏情况下,每次插入可能都需要移动已排序部分的所有元素。因此,总的操作次数与数组长度的平方成正比。

        空间复杂度:插入排序是原地排序算法,它不需要额外的存储空间来保存数据副本。在进行元素插入时,只需要常数级别的临时空间用于交换元素或者存储中间值。因此,插入排序的空间复杂度为O(1),即空间复杂度与输入数组的大小无关。

        稳定性:稳定,在插入排序过程中,当遇到相等键值的元素时,只会将待插入元素放置在已排序部分中相等元素的后面,不会改变相等元素之间的原有顺序,故保持了稳定性。

二、插入排序的算法步骤

  1. 初始化阶段:一开始时已排序部分仅包含数组的第一个元素,被视为已排序。
  2. 遍历数组:每次从未排序部分取出一个元素,将其按正确的顺序插入到已排序部分的适当位置。
  3. 比较元素:从待插入元素开始,向前遍历已排序部分,比较待插入元素与当前元素的大小,若待插入元素较小,则将当前元素向后移动一位,直到找到合适的位置或到达已排序部分的起始处。然后将待插入元素插入到这个位置,保证插入后已排序部分依然保持有序。
  4. 重复执行:随着每次迭代,已排序部分不断增长,未排序部分相应减小,直到整个数组变为已排序状态。

三、基于Python的插入排序实现

def insertion_sort(arr):# 遍历从第二个元素开始到最后一个元素for current in range(1, len(arr)):# 当前待插入元素key = arr[current]# 已排序部分的最后一个元素的索引sorted_end = current - 1# 将当前元素与已排序部分的元素进行比较并移动while sorted_end >= 0 and key < arr[sorted_end]:arr[sorted_end + 1] = arr[sorted_end]sorted_end -= 1# 在正确位置插入当前元素arr[sorted_end + 1] = key# 示例
arr = [5, 2, 4, 6, 1, 3]
insertion_sort(arr)
print(arr)  # 输出: [1, 2, 3, 4, 5, 6]

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

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

相关文章

极狐GitLab对接OAuth2实现SSO

本文作者&#xff1a;极狐(GitLab) 高级解决方案架构师 武让 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 企…

Python处理PDF:在PDF文档中插入页眉和页脚

在处理篇幅较长、结构复杂的PDF文档时&#xff0c;页眉和页脚的设计与插入就显得尤为重要。它们不仅扮演着美化文档、提升专业度的角色&#xff0c;更承担了导航指引、信息标注的重要功能。 页眉通常用于展示文档的标题或章节名称&#xff0c;有助于读者在翻阅过程中迅速定位所…

Java - 赋值运算符

在这个实战中&#xff0c;我们将学习赋值运算符的使用方法。首先&#xff0c;我们将介绍简单赋值运算符的基本概念和语法格式。然后&#xff0c;我们将通过案例演示来加深对赋值运算符的理解。接下来&#xff0c;我们将对比Java和Python这两种不同的编程语言&#xff0c;探讨它…

spring rest

controller 类的注解 Controller RequestMapping(“/api/ads”)类的方法的注解 ResponseBody GetMapping(“/postAds/{ad_id}”) - 查 PostMapping() - 增 PutMapping() - 改 DeleteMapping() PatchMapping()类的方法的参数的注解 PathVariable() RequestBody() RequestParam()…

移动端网络库行业动态-整理

欢迎各位同行补充。 阿里&#xff1a; 2023.12 淘宝移动端统一网络库的架构演进和弱网优化技术实践 http://www.52im.net/thread-4470-1-1.html 网易&#xff1a; cronet 多端统一&#xff0c;2021.11 网易云音乐网络库跨平台化实践&#xff1a;https://segmentfault.com/a/1…

电能质量管理解决方案探讨 安科瑞 许敏

电能质量在线监测装置 本办法对发电企业&#xff08;包括分布式电源&#xff09;、电网企业、用电企业的电能质量管理均有明确要求&#xff0c;要求在发电企业并网点、电网企业非线性设施、用电企业公共连接点设置电能质量监测装置&#xff0c;这会促进市场对电能质量在线监测…

理解 编译和链接

目录 1. 翻译环境和运行环境 2. 翻译环境 2.1 预处理&#xff08;预编译&#xff09; 2.2 编译 2.2.1 词法分析&#xff1a; 2.2.2 语法分析 2.2.3 语义分析 2.3 汇编 2.4 链接 3. 运行环境 1. 翻译环境和运行环境 在ANSI C的任何一种实现中&#xff0c;存在两个不同…

Linux开发--进程

经典五问&#xff1a; 1.什么是程序&#xff1f;什么是进程&#xff1f; 从是否运行进行判断: gcc xxx -o pro&#xff0c;磁盘中生成的pro文件&#xff0c;就是程序 进程是程序一次运行活动 程序是静态的概念&#xff0c;进程是动态的概念。 2.如何查看系统中的进程: 在l…

二叉树练习day.6

654.最大二叉树 链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前…

C盘突然爆满,并且清理空间后,马上又会爆满

C盘突然爆满&#xff0c;并且清理空间后&#xff0c;马上又会爆满 原因解决 原因 idea本地在跑数据打印日志&#xff0c;导致产生了一个名为idea_test_1.out的文件&#xff0c;这个文件在持续增大 解决 手动删除idea_test_1.out&#xff0c;或者等任务跑完也会自动删除&…

MySQL——全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 实验&#xff1a; 表productnotes &…

大学 Python 程序设计实验报告基于自定义函数的程序设计

目录&#xff1a; 一、实验目的二、实验要求三、实验内容与程序代码 一、实验目的 掌握自定义函数的定义和使用&#xff0c;掌握递归函数和匿名函数的设计和使用、掌握常用标准库和第三方库的使用。 二、实验要求 函数的定义、调用&#xff0c;函数的参数调用。递归函数的设…

Testng测试框架(5)--依赖

有时候&#xff0c;你需要按照特定的顺序调用测试方法。这里有几个例子&#xff1a; 在运行更多测试方法之前&#xff0c;确保一定数量的测试方法已经完成且成功。 在初始化你的测试时&#xff0c;同时希望这些初始化方法也是测试方法&#xff08;用Before/After标记的方法不…

测试用例的编写方式

学习目标 能对穷举场景设计测试点能对限定边界规则设计测试点能对多条件依赖关系进行设计测试点能对于项目业务进行设计测试点 目录 等价类划分法案例 等价类划分 说明&#xff1a;在所有测试数据中&#xff0c;具有某种共同特征的数据集合进行划分分类&#xff1a; 有效等…

线程池参数如何设置

线程池参数设置 hello丫&#xff0c;各位小伙伴们&#xff0c;好久不见了&#xff01; 下面&#xff0c;我们先来复习一下线程池的参数 1、线程池参数有哪些&#xff1f; corePoolSize&#xff08;核心线程数&#xff09;&#xff1a;线程池中的常驻核心线程数。即使这些线程…

Java与Kotlin语言的特色之处

一、Java特色之处&#xff1a; 1.多异常捕获 一个try块可能捕获到多个异常&#xff0c;可以使用多个catch块分别处理每个异常&#xff0c;也可以使用一个catch块处理多个异常&#xff08;多个异常使用管道符|分隔&#xff09;。 多个catch块代码&#xff1a; try{ }catch(IOExc…

rancher踩坑日志-删除rancher接入后创建namespace失败(还继续走rancher的逻辑)

创建新的命名空间报错 [haimaKS-STAG-NODE01 ~]$ kubectl create namespace test01 Error from server (InternalError): Internal error occurred: failed calling webhook "rancher.cattle.io.namespaces.create-non-kubesystem": Post "https://rancher-web…

拥抱Linux,拥抱开源,拥抱未来

拥抱Linux,拥抱开源,拥抱未来 在这一系列的Linux专栏博客中,我们从入门到进阶,从技能到生态,再到未来展望,全方位地探讨了Linux的方方面面。Linux已经成为了我们数字生活中不可或缺的一部分,它正在深刻地影响和改变着我们的世界。 1. Linux:技术的力量 Linux不仅仅是一个操作…

FMEA与各设计工具之间有哪些联系——SunFMEA软件

在设计领域&#xff0c;FMEA与其他设计工具之间存在着紧密的关系&#xff0c;这些工具共同支持设计师在产品开发的各个阶段做出明智的决策&#xff0c;今天SunFMEA软件和大家一起了解FMEA与各设计工具之间的联系。 首先&#xff0c;FMEA与CAD&#xff08;计算机辅助设计&#…

搭建PyTorch神经网络进行气温预测(手写+调包两种方法)(保证学会!)+找到神经网络的最优情况

代码上有注释&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 本篇主要包括三大部分&#xff1a; 第一部分&#xff1a;导入数据集导入第三方库数据集简单介绍与可视化数据集简单预处理 第二部分&#xff1a;手写神经网络代码实现气温预测&#…