【数据结构】八大排序之直接插入排序算法

🦄个人主页:修修修也

🎏所属专栏:数据结构

⚙️操作环境:Visual Studio 2022


一.直接插入排序简介及思路

直接插入排序(Straight Insertion Sort)是一种简单直观的插入排序算法.

它的基本操作是:

  • 一个数据插入到已经排好的有序表中,从而得到一个新的,数据数增1的有序表.
  • 直到所有的数据插入完为止,得到一个新的有序序列.

在实际生活中,我们玩扑克牌时就使用了插入排序的思想:

算法动图演示如下:


二.直接插入排序的代码实现

算法实现步骤:(以升序为例)

  1. 当表中只有第一个数据的时候它是一定有序的,因此我们第二个元素开始向前面的有序表"插入"数据.
  2. 具体插入方式,使用tmp记录下当前待插入元素,然后tmp从后向前与有序表中的元素逐一比对,如果tmp小于比对元素,则比对元素向后挪动一个位置.
  3. 直到tmp不小于比对元素时,tmp插入到比对元素后面.
  4. 循环将数据向前插入,直到将待排数组的所有数据元素都插入进有序表,排序完成.

清楚了逻辑和概念后,我们的代码实现就比较简单了.代码如下:

//插入排序(升序
void InsertSort(int* a, int n)
{for (int i = 1; i < n; i++){int end = i - 1;int tmp = a[i];//将tmp插入到[0,end]这个有序表的区间里while (end >= 0){if (tmp < a[end])  //如果tmp小于比对元素,将比对元素向后挪{a[end + 1] = a[end];end--;}else       //如果tmp不小于比对元素,将tmp插入到比对元素后面{break;}}a[end + 1] = tmp;}
}

三.直接插入排序的时间复杂度分析

📌最好情况时间复杂度

直接排序的最好情况是每个tmp向前插入时都发现自己恰好不小于前面有序表中的最后一个元素,这时就直接将自己放在自己原本的地方就可以继续向前插入下一个元素了,即数组完全顺序的情况:

易得此时的:

  • 算法执行次数为: n-1
  • 算法时间复杂度为: O(n)

📌最坏情况时间复杂度

直接插入的最坏情况是遇到每一个tmp都直到比对到前面有序表的0号位置才插入,即数组完全逆序的情况:

此时算法每趟的交换次数累加起来就是1 + 2 + ...... +(n-2)+(n-1),可以发现当算法执行结束,所有次数累加起来恰好是一个等差数列,我们利用求和公式可得:

  • 算法执行总次数为: \frac{1}{2}n^{2}-\frac{1}{2}n
  • 算法时间复杂度为: O(n^{2})

四.直接插入排序的优化

我们通过对前面直接插入排序的分析可以发现,当数组整体完全逆序时:

算法的执行总次数为:(1+2+......+n-1)

算法的执行总次数为:\frac{1}{2}n^{2}-\frac{1}{2}n


但是如果我们面对的是前后两部分分别逆序的数组时:

算法的执行总次数为:(1+2+...+\frac{n}{2}-1)+(1+2+...+\frac{n}{2}-1)

算法的执行总次数为:\frac{1}{4}n^2-\frac{1}{2}n

此时算法的效率就提高了:\frac{1}{4}n^2


如果我们再分为前后四部分逆序的数组时:

算法的执行总次数为:(1+2+...+\frac{n}{4}-1)*4

算法的执行总次数为:\frac{1}{8}n^2-\frac{1}{2}n

此时算法的效率又提高了:\frac{1}{8}n^2


通过前面的分析,我们可以发现,随着我们分的部分的增加,算法的执行次数在有规律的减少:

分成k部分算法执行总次数有如下关系:\frac{1}{k}*\frac{1}{2}n^2-\frac{1}{2}n

如果我们令k无限大,此时算法的执行次数就可以忽略n^2项,而只剩下1/2n项了

其实k无限大的情况,就是数组被分为只有前后两个元素逆序的情况:

这种情况下,算法的执行总次数:(1+1+......+1+1)

算法的执行总次数:\frac{n}{2}

通过上面的分析,我们可以得到一个结论:

数组元素越接近基本有序,直接插入排序算法的时间复杂度就会越低.

那么我们是不是可以在正式进行插入排序之前数组元素先简单"预排序"一下呢,即在预排序中,我们尽量将大一些的元素放在数组靠后的位置,小一些的元素放在数组靠前的位置,这样再进行直接插入排序就能使效率提高很多.

如果你能够理解这一直接插入排序算法的优化思路,那么恭喜你,你已经理解了希尔排序的思想,接下来我会在另一篇博客中,详细介绍怎样通过这一思路优化直接插入排序算法,最终构造出非常著名的希尔排序算法.

感兴趣的朋友可以直接点击下方文章链接查看希尔排序算法的相关内容:

【数据结构】八大排序之希尔排序icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135043566


结语

希望这篇直接插入排序算法详解能对大家有所帮助,欢迎大佬们留言或私信与我交流.

有关更多排序相关知识可以移步:

【数据结构】八大排序算法icon-default.png?t=N7T8https://blog.csdn.net/weixin_72357342/article/details/135038495?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135038495%22%2C%22source%22%3A%22weixin_72357342%22%7D&fromshare=blogdetail

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【数据结构】八大排序之冒泡排序算法

【数据结构】八大排序之希尔排序算法

......


数据结构排序算法篇思维导图:


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

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

相关文章

HarmonyOS--基础组件Button

Button组件 可以包含单个子组件。 Button(label?: ResourceStr, options?: { type?: ButtonType, stateEffect?: boolean }) 1&#xff1a;文字按钮 Button(‘点击’) 2&#xff1a;自定义按钮,嵌套其它组件 Button() {Image(https://) }.type(ButtonType.Circle)

强化学习------Policy Gradient算法公式推导

目录 一、前言二、公式推导基线 三、代码实现四、参考 一、前言 Policy Gradient 算法是一种基于策略的强化学习算法&#xff0c;与基于值的方法&#xff08;如Q-learning和DQN&#xff09;不同。基于值的方法主要关注于学习值函数&#xff08;如状态值函数或者动作值函数&…

Notepad++插件:格式化JSON

一、问题描述 最近有这么一串json字符串&#xff1a; 你想看吗&#xff1f; 是不是觉得密密匝匝滴&#xff0c;很不想看呢&#xff1f; 下面是经过处理的json字符串&#xff1a; 你喜欢哪种格式的json字符串展示呢&#xff1f; 反正我喜欢已经格式化的&#xff0c;也就是第二…

分享66个JavaGame源码总有一个是你想要的

分享66个JavaGame源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 游戏下载链接&#xff1a;https://pan.baidu.com/s/1BUVmun2RhAY4vAMJwcY0mQ?pwd6666 提取码&#xff1a;6666 游戏项目名称 java实现…

echarts 进度条类型柱状图

父组件&#xff1a; <barChartProfit :opt"avgProfit" />import barChartProfit from "./components/barChartProfit";data() {return {avgProfit: {xData: [2019, 2020, 2021, 2022, 2023],totalData: [30,30,30,30,30],seriesData: [10,11,12,21,…

Repo sync 时出现fatal_ couldn‘t find remote ref refs_heads_master问题解决

repo sync默认的origin分支是master&#xff0c;它默认会依赖master&#xff0c;但是我们的manifests分支是main&#xff0c;需要解决这个问题主要执行下面的几步&#xff1a; 更新repo到最新版本 cd .repo/repo git pull # 更新repo前往git库创建origin master 在manifests…

08-工厂方法

意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类 类图 适用性 在下列情况可以使用工厂方法模式&#xff1a; 当一个类不知道它所必须创建的对象的类的时候。当一个类希望由它的子类来指定它所创建的对象的时候。当类将创建对象的职责委托给多个帮助子…

张剑辉:打通储能产品全生命周期数据 提升电站资产价值

12月16日&#xff0c;2023高工储能年会暨高工金球奖颁奖典礼在深圳举办&#xff0c;海博思创应邀参会&#xff0c;董事长、总经理张剑辉发表了题为《新型电力系统构建中的电化学储能系统》的主题演讲&#xff0c;系统介绍了电化学储能领域的创新技术和行业趋势&#xff0c;并与…

2020 年网络安全应急响应分析报告

2020 年全年奇安信集团安服团队共参与和处置了全国范围内 660起网络安全应急响应事件。2020 年全年应急响应处置事件行业 TOP3 分别为:政府部门行业(146 起)医疗卫生行业(90 起)以及事业单位(61 起&#xff0c;事件处置数分别占应急处置所有行业的 22.1%、13.6%、9.2%。2020 年…

冷热字段分离提升程序局部性

突然想起了上学期课堂上的一个提升程序局部性的案例&#xff0c;我觉得非常有意思&#xff0c;写篇博客记录一下。 1 场景 案例场景非常简单&#xff0c;就是遍历访问大结构体数组的某一字段。对应到下图&#xff0c;funcA要访问a[N]的fld3字段&#xff0c;funcB中要访问b[N]…

风格随心选,AGI 让家居行业实现「秒级整装」内容营销

家居行业的营销方式正在不断变化&#xff0c;从面向大牌代言、广告覆盖的品牌化营销&#xff0c;发展成了面向个性化消费者的多元化营销。 过去&#xff0c;家居消费者也许更看重产品材质&#xff0c;那是品味的彰显&#xff1b;如今&#xff0c;颜值即正义&#xff0c;消费者则…

教你如何阻止垃圾软件自动安装丨这几种方法可以参考

你遇到电脑自动安装乱七八糟软件的问题吗&#xff1f;面对这种情况&#xff0c;大多数人都会抱怨“这什么破电脑啊&#xff1f;”&#xff0c;然而造成这个问题的罪魁祸首还是用户自己。 下载安装时要注意&#xff1a; 我们安装软件的时候&#xff0c;如果不注意默认勾选了插件…