插入排序

插入排序是一种简单直观的排序算法。它的基本思想是将待排序的数据分成已排序和未排序两部分,每次从未排序部分选择一个元素插入到已排序部分的合适位置,直到未排序部分为空。

插入排序是一种简单直观的排序算法,它的基本思想是将一个元素插入到已排序好的序列中的适当位置。

典例: 假设要对数组 [5, 2, 4, 6, 1, 3] 进行排序。

首先,我们将第一个元素 5 视为已排序的序列,因为只有一个元素。

接下来,我们从第二个元素 2 开始,将它插入到已排序序列中的正确位置。由于 2 小于 5,所以我们将 2 插入到第一个位置,得到序列 [2, 5, 4, 6, 1, 3]。

然后,我们继续处理下一个元素 4。我们将 4 与已排序序列中的元素依次比较,发现它应该插入到第二个位置,得到序列 [2, 4, 5, 6, 1, 3]。

接下来,我们继续处理下一个元素 6。由于 6 大于 5,所以它应该位于已排序序列的最后一个位置,得到序列 [2, 4, 5, 6, 1, 3]。

再处理下一个元素 1。我们将 1 与已排序序列中的元素依次比较,发现它应该插入到第一个位置,得到序列 [1, 2, 4, 5, 6, 3]。

最后,我们处理最后一个元素 3。我们将 3 与已排序序列中的元素依次比较,发现它应该插入到第三个位置,得到最终排序结果 [1, 2, 3, 4, 5, 6]。

通过这个例子,我们可以看到插入排序的过程就是通过不断地将元素插入到已排序序列中的适当位置,逐步形成有序序列的过程。

具体实现步骤如下:

  1. 将第一个元素当作已排序部分,将剩余的元素看作未排序部分。
  2. 从未排序部分选择一个元素,插入到已排序部分的合适位置。这个位置是在已排序部分中找到一个比待插入元素大的元素之前的位置。
  3. 重复步骤2,直到未排序部分为空。

以下是一个示例的插入排序过程:

待排序数组:[7, 3, 5, 9, 1, 4]

第一次插入排序:已排序部分:[7],未排序部分:[3, 5, 9, 1, 4] 从未排序部分选择元素3,插入到已排序部分的合适位置,得到已排序部分:[3, 7],未排序部分:[5, 9, 1, 4]

第二次插入排序:已排序部分:[3, 7],未排序部分:[5, 9, 1, 4] 从未排序部分选择元素5,插入到已排序部分的合适位置,得到已排序部分:[3, 5, 7],未排序部分:[9, 1, 4]

第三次插入排序:已排序部分:[3, 5, 7],未排序部分:[9, 1, 4] 从未排序部分选择元素9,插入到已排序部分的合适位置,得到已排序部分:[3, 5, 7, 9],未排序部分:[1, 4]

第四次插入排序:已排序部分:[3, 5, 7, 9],未排序部分:[1, 4] 从未排序部分选择元素1,插入到已排序部分的合适位置,得到已排序部分:[1, 3, 5, 7, 9],未排序部分:[4]

第五次插入排序:已排序部分:[1, 3, 5, 7, 9],未排序部分:[4] 从未排序部分选择元素4,插入到已排序部分的合适位置,得到已排序部分:[1, 3, 4, 5, 7, 9],未排序部分:[]

最终排序结果:[1, 3, 4, 5, 7, 9]

插入排序的时间复杂度为O(n^2),其中n为待排序数组的长度。对于有序数组,插入排序的时间复杂度为O(n),是一种稳定的排序算法。

减少队列和构建新的队列,新的队列插入算法可以优化。

以下是插入排序的一种常见模板:

def insertion_sort(arr):n = len(arr)for i in range(1, n):key = arr[i]  # 当前要插入的元素j = i - 1  # 已排序序列的最后一个元素下标while j >= 0 and arr[j] > key:  # 将大于当前元素的元素往后移动arr[j + 1] = arr[j]j -= 1arr[j + 1] = key  # 将当前元素插入到正确位置return arr

这个模板中,使用一个 for 循环遍历未排序序列的每个元素,将当前元素插入到已排序序列的适当位置。

你可以调用 insertion_sort 函数并传入一个待排序的数组来测试它的功能。例如:

python复制插入

arr = [4, 2, 5, 1, 3]
sorted_arr = insertion_sort(arr)
print(sorted_arr)  # 输出 [1, 2, 3, 4, 5]

复制插入

这个插入排序算法的时间复杂度是 O(n^2),其中 n 是待排序数组的长度。

内部使用一个 while 循环来找到当前元素应该插入的位置。该循环将已排序序列中比当前元素大的元素往后移动一个位置,直到找到不大于当前元素的位置。最后将当前元素插入到正确位置。

时间复杂度为 O(n^2),空间复杂度为 O(1)。

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

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

相关文章

Windows系统安装MySQL

下载MySQL 打开网址MySQL :: Download MySQL Community Server点击图下所示位置Download 进入图下所示界面,点击图下所示位置不登录下载 已下载完成 安装MySQL 将下载好的压缩包解压到一个专门的位置,该软件为绿色版软件,解压即可使用 配置…

Open3D mesh Taubin滤波

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 参数详解 返回值 2.2完整代码 三、实现效果 3.1加入噪声的mesh 3.2Taubin迭代10次 3.3Taubin迭代100次 Open3D点云算法汇总及实战案例汇总的目录地址: Open3D点云算法与点云…

分布式云扩展 AI 边缘算力,助力用户智能化创新

近期,AI 创新圈再次发布重磅产品更新。OpenAI 全新旗舰版多模态模型 GPT-4o 横空出世,其打通文本、图像、视频的富媒体理解能力以及敏捷的智能化对话,将 AI 助手的人性化表达效果,提升至更高水平。 ​ 从技术源头来看&#xff0c…

数据线性结构

一、线性表 优点:可以很快速的找到内存地址 查询,修改快 缺点:在中间部分新增,删除部时需要移动后续的元素 像java中的stream流的过滤等操作都是新建立一个集合有序插入返回,空间换时间 java中list下标为什么要从0开…

网工面试题(安全)

上一篇:网工面试题(数通) 防火墙 防火墙的应用场景 防火墙:部署在网络出口处/服务器区(数据中心)/广域网接入,用于防止外界黑客攻击、保护内网安全硬件。 传统防火墙和下一代防护墙的区别 传统防火墙的功能…

AJAX day-02 HTTP格式JSON格式

目录 一. 计算机网络 1.1 网络参考模型 1.2 各层重要对应的协议 1.3 DNS解析(域名解析服务器) 1.4 FTP(文件传输协议) 1.5 UDP(用户数据报协议) 1.6 TCP(传输控制协议) 1.7 IP(网际互连协议) 1.8 …

golang本地缓存fastcache高性能实现原理

1. git仓库 https://github.com/abbothzhang/fastcache 2. 整体原理 initCache时不会申请内存,只有第一次set时候才会申请,且会一次性申请64MB,后面不够了又一次性申请1024*64MB大小内存 2.1. 时序图 3. 高性能原因 将cache分为512个buc…

C++奇迹之旅:深度解析list的模拟实现

文章目录 📝前言🌠list节点🌉list 🌠迭代器的创建🌉const迭代器 🌠代码🚩总结 📝前言 🌠list节点 我们先建立一个列表里的节点类listnode,用来构造list的节…

数据仓库系列 3:数据仓库的主要组成部分有哪些?

你是否曾经好奇过,当你在网上购物或使用手机应用时,背后的数据是如何被存储和分析的?答案就在数据仓库中。本文将为你揭开数据仓库的神秘面纱,深入探讨其核心组成部分,以及这些组件如何协同工作,将海量数据转化为有价值的商业洞察。 目录 引言:数据仓库的魔力1. 数据源和数据…

[Algorithm][综合训练][体育课测验(二)][合唱队形][宵暗的妖怪]详细讲解

目录 1.体育课测验(二)1.题目链接2.算法原理详解 && 代码实现 2.合唱队形1.题目链接2.算法原理详解 && 代码实现 3.宵暗的妖怪1.题目链接2.算法原理详解 && 代码实现 1.体育课测验(二) 1.题目链接 体育课测验(二) 2.算法原理详解 && 代码实现…

解决Selenium已安装,在pycharm导入时报错

搭建设selenium环境时,selenium已安装,但是在pycharm中使用“from selenium import webdriver”语句时红线报错 解决方案: 1.file->settings进入设置 2.点击加号,搜索‘selenium’安装 3,等待安装完成&#xff0…

项目技巧二

目录 java中Date和mysql数据库datetime数据类型 注意: 在yml文件中配置成员变量的值 1.写一个yml文件 2.写一个与yml相互映射的类来读取yml的属性信息 3.在其他子模块的配置类中开启此类,读取yml文件的内容信息 4.直接依赖注入(因为已…

Java多进程调用dll程序和exe程序

🎯导读:本文介绍了使用Java调用本地DLL及EXE程序的方法。针对DLL调用,文章提供了基于Java Native Access (JNA) 库的具体实现方案,包括定义Java接口以映射DLL中的函数,并展示了如何加载DLL及调用其中的方法。对于EXE程…

opencv之几何变换

文章目录 1 前言2 线性几何变换的主要类型2.1 平移 (Translation):2.1.1 定义2.1.2代码 2.2 缩放 (Scaling):2.2.1 定义2.2.2 代码 2.3 旋转 (Rotation):2.3.1 定义2.3.2 代码 2.4 仿射变换 (Affine Transformation):2.4.1 定义2.…

数据源10min自动断开连接导致查询抛异常(未获取可用连接)

由于个人能力有限,本文章仅仅代表本人想法,若有不对请即时指出,若有侵权,请联系本人。 1 背景 工作中引入druid来管理数据源连接,由于数据源每隔10分钟强制管理空闲超过10分钟的连接,导致每隔10分钟出现1…

3D打印透气钢与传统透气钢的差异

透气钢作为一种集金属强度与透气性能于一体的特殊材料,在注塑模具领域扮演着关键角色,通过有效排除模具内困气,显著提升制品成型质量与生产效率。当前,市场上主流的透气钢产品多源自日本、美国,其高昂成本与技术壁垒限…

Golang | Leetcode Golang题解之第388题文件的最长绝对路径

题目&#xff1a; 题解&#xff1a; func lengthLongestPath(input string) (ans int) {n : len(input)level : make([]int, n1)for i : 0; i < n; {// 检测当前文件的深度depth : 1for ; i < n && input[i] \t; i {depth}// 统计当前文件名的长度length, isFi…

生成艺术,作品鉴赏:物似主人形

2001年&#xff0c;当21岁的我&#xff0c;还在恒基伟业当高级工程师时。我有一个女同事&#xff0c;她有个特别大的杯子用来喝水&#xff0c;不夸张的说&#xff0c;是那种我从来没见过的大杯子&#xff0c;由于她是很大只的那种&#xff0c;她便自嘲说&#xff1a;「物似主人…

【Kubernetes部署篇】二进制搭建K8s高可用集群1.26.15版本(超详细,可跟做)

文章目录 一、服务器环境信息及部署规划1、K8S服务器信息及网段规划2、服务器部署架构规划3、组件版本信息4、实验架构图 二、初始化环境操作1、关闭防火墙2、配置本地域名解析3、配置服务器时间保持一致4、禁用swap交换分区(K8S强制要求禁用)5、配置主机之间无密码登录6、修改…

JVM2-JVM组成、字节码文件、类的生命周期、类加载器

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等内容都会放在这块区域中执行引…