Go版数据结构 -【8.3 插入排序】

8.3 插入排序

插入排序是一种简单且直观的排序算法,它的基本思想是将数组分为已排序和未排序两个部分。

通过逐步将未排序部分的元素插入到已排序部分的正确位置,逐步构建整个有序序列。

看起来与选择排序是差不多的,但是还是有一些差别的。

选择排序是一直从未排序序列中选择最小/最大的元素插入到已排序队列中。

而插入排序则是:每次从未排序的序列中拿到第一个元素,与已排序序列的元素比较,之后找到它自己合适的位置插入进去。

本节代码存放目录为 lesson19


概念与原理

插入排序的原理如下:

  • 将第一个元素视为已排序部分,其他元素为未排序部分。

  • 从未排序部分的第一个元素开始,将其与已排序部分的元素逐个比较,找到其正确位置并插入。

  • 重复步骤 2,直到所有元素都插入到已排序部分。

插入排序的基本特点:

  • 时间复杂度为 O(n^2),适合少量数据的排序。

  • 插入排序是稳定的,因为相同元素的相对顺序不会改变。


插入排序的步骤示例

给定如下无序数组,按照从小到大排序:

[5, 3, 8, 4, 2]

通过插入排序的步骤如下:

第一轮:- 第一个元素 5 作为已排序部分,即:[5]- 将 3 插入到已排序部分 [5],结果:[3, 5, 8, 4, 2]第二轮:- 将 8 插入到已排序部分 [3, 5],结果:[3, 5, 8, 4, 2]第三轮:- 将 4 插入到已排序部分 [3, 5, 8],结果:[3, 4, 5, 8, 2]第四轮:- 将 2 插入到已排序部分 [3, 4, 5, 8],结果:[2, 3, 4, 5, 8]

最终,排序结果为 [2, 3, 4, 5, 8]


插入排序的时间复杂度

插入排序的时间复杂度取决于数组的初始状态:

  • 最坏情况O(n²),即数组是反序排列的。

  • 最好情况O(n),即数组已经是有序的。

  • 平均情况O(n²),即数组是随机排列的。

Go语言的实现

实现代码如下:

func insertionSort(arr []int) {// 从第二个元素开始遍历,认为第一个元素是已排序的for i := 1; i < len(arr); i++ {key := arr[i]j := i - 1// 在已排序部分中寻找插入位置for j >= 0 && arr[j] > key {arr[j+1] = arr[j] // 将比key大的元素右移j--}arr[j+1] = key // 插入key到正确位置fmt.Printf("第 %d 轮插入结果: %v\n", i, arr)}
}func main() {arr := []int{5, 3, 8, 4, 2}insertionSort(arr)fmt.Println("最终排序结果: ", arr)
}

执行结果如下所示:

1 轮插入结果: [3 5 8 4 2]2 轮插入结果: [3 5 8 4 2]3 轮插入结果: [3 4 5 8 2]4 轮插入结果: [2 3 4 5 8]
最终排序结果:  [2 3 4 5 8]

通过上面的实现,我们可以看到插入排序通过一轮一轮地将元素插入到正确的位置,逐渐将整个数组变得有序。


小结

本节我们讲解了插入排序的基本原理、步骤示例和 Go 语言的实现。

关于本节总结如下:

  • 时间复杂度:插入排序的时间复杂度为 O(n²),最坏情况下会逐步遍历所有元素。

  • 稳定性:插入排序是稳定的排序算法。

  • 应用场景:插入排序适用于数据量较小或部分已排序的场景,且在数组接近有序时效率较高。


我的GitHub:https://github.com/swxctx

书籍地址:https://gs.golang.website/

书籍代码:https://github.com/YouCanGolang/GoStructedCode

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

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

相关文章

【React】setState (useState) 是怎么记住上一个状态值的?

在 React 中&#xff0c;setState 通过 React 内部的状态管理机制来记住上一个状态值。即使每次组件重新渲染时&#xff0c;函数组件会被重新执行&#xff0c;React 仍能通过其内部的状态管理系统保持和追踪组件的状态变化。下面详细解释其工作原理&#xff1a; 1. setState 的…

Web安全 - 路径穿越(Path Traversal)

文章目录 OWASP 2023 TOP 10导图定义路径穿越的原理常见攻击目标防御措施输入验证和清理避免直接拼接用户输入最小化权限日志监控 ExampleCode漏洞代码&#xff1a;路径穿越攻击案例漏洞说明修复后的安全代码代码分析 其他不同文件系统下的路径穿越特性Windows系统类Unix系统&a…

ctfshow-web 萌新题

给她 spring漏洞 pyload: 1.dirsearch扫描&#xff0c;发现git 2. GitHack工具得到.git文件 <?php $passsprintf("and pass%s",addslashes($_GET[pass])); $sqlsprintf("select * from user where name%s $pass",addslashes($_GET[name])); ?>…

python 实现graph list图列算法

graph list图列算法介绍 图列&#xff08;Graph List&#xff09;算法通常指的是在图的表示中&#xff0c;使用列表&#xff08;List&#xff09;或更具体地说&#xff0c;邻接表&#xff08;Adjacency List&#xff09;来表示图的一种算法。邻接表是图的一种常见表示方法&…

Python知识点:结合Python工具,如何使用GPT进行文本生成

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何使用Python工具进行GPT文本生成 概述 GPT&#xff08;Generative Pre-trai…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

Apache NiFi最全面试题及参考答案

目录 解释什么是Apache NiFi以及它的主要用途。 NiFi 的数据处理流程是怎样的? NiFi 的架构包括哪些组件? 解释 NiFi 的 “FlowFile” 概念及其组成部分。 NiFi 的 “Processor” 是什么?有哪些类型? 如何在 NiFi 中创建一个新的数据流? NiFi 的 “Connection” 有…

leetcode经典算法题总结

针对leetcode算法题常见的五大经典复杂算法进行如下总结&#xff1a; &#xff08;1&#xff09;分治法 把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解…

SciPy的详细学习要点

SciPy是一个开源的Python科学计算库&#xff0c;它建立在NumPy数组对象之上&#xff0c;提供了许多科学和工程计算中常用的函数和工具。以下是学习SciPy时的一些详细要点&#xff1a; 1. 理解SciPy与NumPy的关系 - SciPy是基于NumPy构建的&#xff0c;因此熟练掌握NumPy是使用…

Springboot 阿里云对象存储OSS 工具类

AliyunUtils&#xff1a;仿造官方的示例代码改造的工具类&#xff0c;方便对阿里云OSS进行便捷操作 package com.wzb.utils20241009;import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import org.springframework.beans.factory.annotation.Autowired; im…

介绍几个电池充电管理芯片(TP4056、SGM40561)

TP4056 上一篇我们介绍了个TP4055&#xff0c;那么跟TP4055相比&#xff0c;TP4056肯定是做了升级的。 首先是有最高1000mA的充电电流&#xff0c;而TP4055是500mA。 一般来说我们尽可能的让充电电流接近电池容量的一半&#xff0c;这样对电池比较好。 充电电压都是4.2V。 …

vite学习教程06、vite.config.js配置

前言 博主介绍&#xff1a;✌目前全网粉丝3W&#xff0c;csdn博客专家、Java领域优质创作者&#xff0c;博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容&#xff1a;Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。 博主所有博客文件…

【React】增量传输与渲染

增量传输 增量传输是一种高效的文件传输方式&#xff0c;其核心原理在于只传输文件中发生变化的部分&#xff0c;而不是整个文件。以下是增量传输的详细解析&#xff1a; 定义与原理&#xff1a; 增量传输通过比对原始文件和目标文件&#xff0c;找出两者之间的差异部分&#…

【JS】最长递增子序列算法

最长递增子序列问题&#xff08;Longest Increasing Subsequence&#xff0c;简称LIS&#xff09;是指在一个序列中找到一个最长的子序列&#xff0c;使得这个子序列中的元素是递增的。比如序列 [10, 9, 2, 5, 3, 7, 101, 18] 的最长递增子序列为 [2, 3, 7, 18]&#xff0c;长度…

用Python制作数据可视化仪表盘:使用Dash与Plotly构建实时交互式仪表盘

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在数据驱动的世界中,可视化是理解和解释复杂数据的关键工具。通过数据可视化,用户能够快速洞察数据趋势,做出明智决策。而仪表盘作为一种高度集成的可视化工具,能够将多种数据图表汇总到一个界面上,便于实时…

【微信小程序前端开发】入门Day03 —— 页面导航、事件、生命周期、WXS 脚本及自定义组件

1. 页面导航 导航方式 声明式导航&#xff1a;使用<navigator>组件实现页面跳转。 <!-- 导航到tabBar页面 --> <navigator url"/pages/message/message" open-type"switchTab">导航到消息页面</navigator><!-- 导航到非tabBar页…

五款专业三维数据处理工具:GISBox、Cesiumlab、OSGBLab、灵易智模、倾斜伴侣深度解析

随着三维数据处理技术的广泛应用&#xff0c;尤其是在城市规划、地理信息系统&#xff08;GIS&#xff09;、工程监测等领域&#xff0c;处理倾斜摄影、三维建模以及大规模数据管理的需求日益增加。以下是五款我精心挑选的倾斜摄影和三维数据处理工具——GISBox、Cesiumlab、OS…

Debezium系列之:Debezium 3.0.0.Final发布

Debezium系列之:Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标MariaDB连接器的更改版本 11.4.3 支持MongoDB连接器的更改MongoDB sink connectorMySQL连接器的改变MySQL 9MySQL向量数据类型Oracle连接…

Vue3入门学习

Vue3入门学习 1. Vue3简介1.1. 【性能的提升】1.2.【 源码的升级】1.3. 【拥抱TypeScript】1.4. 【新的特性】 2. 创建Vue3工程2.1. 【基于 vue-cli 创建】2.2. 【基于 vite 创建】(推荐)2.3. 【一个简单的效果】 3. Vue3核心语法3.1. 【OptionsAPI 与 CompositionAPI】Options…

每日学习一个数据结构-AVL树

文章目录 概述一、定义与特性二、平衡因子三、基本操作四、旋转操作五、应用场景 Java代码实现 概述 AVL树是一种自平衡的二叉查找树&#xff0c;由两位俄罗斯数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明。想了解树的相关概念&#xff0c;请点击这里。以下是对AVL树的…