前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】排序算法系列——插入排序(附源码+图解)

【数据结构】排序算法系列——插入排序(附源码+图解)

作者头像
Skrrapper
发布2024-09-09 10:22:31
1140
发布2024-09-09 10:22:31
举报
文章被收录于专栏:技术分享

插入排序

算法思想

插入排序的算法思想其实很容易理解,它秉持着一个不变的循环:比较->交换->比较->交换…因为我们排序最终的目的是要得到递增或者递减的数据,那么在原有的数据中,我们可以将数据依次两两进行比较:

  • 如果是升序,那么就将较小的放在较大的前面
  • 如果是降序,那么就将较大的放在较小的前面
图解

我们看图解中,单次比较过程中,拿出来比较的数只会同它左侧的数进行比较,而被比较的数随着比较结束也会根据具体情况向后移动或者是进行交换,向后移动的过程也称为——补位。在全程的比较中,随着补位和交换的进行,进行比较操作的数只会与曾经进行过比较操作的数进行比较——简单来说,就是比较与被比较是交替进行的。我们总结插入排序算法的核心思路——将待排列元素划分为「已排序」和「未排序」两部分,每次从「未排序的」元素中选择一个插入到「已排序的」元素中的正确位置。

C语言代码分析
代码语言:javascript
复制
//升序情况
void InsertSort(int* arr, int n)
{
	int end = n - 1;//从最后一个数据开始进行比较
	int tmp = arr[end];//保存最后一个数据
	while (end >= 0)
	{
		if (tmp <= arr[end])//当tmp小于等于arr[end]时,说明tmp还没有找到合适的位置
		{
			arr[end + 1] = arr[end];//那么就将arr[end]向后移动
			end--;//继续向前比较
		}
		else//当tmp大于arr[end]时,说明tmp已经找到了合适的位置
		{
			break;//那么就直接退出循环
		}
	}
	arr[end + 1] = tmp;
}

//降序情况
void InsertSort2(int* arr, int n)
{
	int begin = 0;//从第一个数据开始进行比较
	int tmp = arr[begin];//保存第一个数据
	while (begin <= n - 1)
	{
		if(tmp>=arr[begin])//当tmp大于等于arr[begin]时,说明tmp还没有找到合适的位置
		{
			arr[begin - 1] = arr[begin];//那么就将arr[begin]向后移动
			begin++;//继续向后比较
		}
		else//当tmp小于arr[begin]时,说明tmp已经找到了合适的位置
		{
			break;//那么就直接退出循环
		}
		arr[begin + 1] = tmp;
}

在现实生活中,扑克牌的排序事实上就是遵循着插入排序的思想:

时间复杂度
  • 插入排序的最优时间复杂度为O(n),在数列几乎有序时效率很高。
  • 插入排序的最坏时间复杂度和平均时间复杂度都为O(n2)
稳定性

鉴于插入排序不会改变前后元素的相对位置,所以: 稳定

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 插入排序
    • 算法思想
      • 图解
        • C语言代码分析
          • 时间复杂度
            • 稳定性
            相关产品与服务
            腾讯云代码分析
            腾讯云代码分析(内部代号CodeDog)是集众多代码分析工具的云原生、分布式、高性能的代码综合分析跟踪管理平台,其主要功能是持续跟踪分析代码,观测项目代码质量,支撑团队传承代码文化。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档