C语言深入浅出讲解直接插入排序算法的实现

 更新时间:2022年05月18日 10:53:02   作者:安然无虞  
插入排序也是最简单的一类排序方法,我今天介绍的也是插入排序里最直观且浅显易懂的直接插入排序。对这个很简单的排序,记得当时也是花了近两个晚上才搞懂它的原理的,接下来就来介绍一下

插入排序分为两种:直接插入排序&希尔排序

直接插入排序

1.基本思想

直接插入排序是一种简单的插入排序算法,其基本思想是:

把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

说得通俗一点就是:

假设区间[0, end]有序,将end+1位置的值插入到[0, end]中,保持区间[0, end+1]依旧有序。

生活中我们玩扑克牌时,就用了插入排序的思想。

在这里,我们以排升序为例。

核心思想:摸牌的过程

动图演示:

2.算法实现

写排序时,先从单趟开始考虑

//[0, end]已经有序,将end+1位置的值插入到[0,end]中,使得[0,end+1]依旧保持有序
//有一个有序区间,插入一个数据,依旧保持有序
void InsertSort(int* a, int n)
{
	for (int i = 0; i < n - 1; i++)
	//控制摸牌的过程,一开始从仅一张开始
	//注意循环结束条件,只需要到n-2的位置,若将其改成i<n,则会出现越界的情况
	{
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)//保证牌是有序的
		{
			if (a[end] > tmp)
			{
				a[end + 1] = a[end];//往后挪,注意画图感受哦
				end--;
			}
			else
			//有两种可能:(现想常规的,再考虑特殊情况)
			//一是找到了比它小的数,放到其后;
			//二是没有比它小的数,直到end为-1才结束
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

完整代码:

3.时间复杂度

直接插入排序时间复杂度是O(N^2),注意哦,不是因为双重循环,需要实际计算来得出时间复杂度。

最坏情况:逆序有序,1+2+3+……+n - 1;O(N^2)

最好情况:顺序有序,1+1+1+……+1。O(N)

到此这篇关于C语言深入浅出讲解直接插入排序算法的实现的文章就介绍到这了,更多相关C语言直接插入排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++实现学生档案管理系统

    C++实现学生档案管理系统

    这篇文章主要为大家详细介绍了C++实现学生档案管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Qt数据库应用之实现通用数据库请求

    Qt数据库应用之实现通用数据库请求

    这篇文章主要为大家介绍了Qt中是如何实现通用数据库请求的,文中的示例代码讲解详细,对我们学习Qt有一定帮助,感兴趣的小伙伴可以了解一下
    2022-03-03
  • MoveWindow() SetWindowPos()的区别于联系

    MoveWindow() SetWindowPos()的区别于联系

    这篇文章主要介绍了VC++中MoveWindow() SetWindowPos()的区别于联系,需要的朋友可以参考下
    2015-01-01
  • 关于C语言程序的内存分配的入门知识学习

    关于C语言程序的内存分配的入门知识学习

    这篇文章主要介绍了关于C语言程序的内存分配的入门知识学习,特别强调了堆与栈的内存空间申请比较,需要的朋友可以参考下
    2015-12-12
  • C语言如何使用函数求素数和举例

    C语言如何使用函数求素数和举例

    素数又称质数,所谓素数是指除了1和它本身以外,不能被任何整数整除的数,下面这篇文章主要给大家介绍了关于C语言如何使用函数求素数和的相关资料,需要的朋友可以参考下
    2022-11-11
  • 解析C++编程中如何使用设计模式中的状态模式结构

    解析C++编程中如何使用设计模式中的状态模式结构

    这篇文章主要介绍了如何在C++编程中适用设计模式中的状态模式结构,状态模式强调将特定状态相关的逻辑分散到一些类的状态类中,需要的朋友可以参考下
    2016-03-03
  • C语言清除scanf()缓存的案例讲解

    C语言清除scanf()缓存的案例讲解

    今天小编就为大家分享一篇关于C语言清除scanf()缓存的案例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • C++实现动态分配const对象实例

    C++实现动态分配const对象实例

    这篇文章主要介绍了C++实现动态分配const对象实例,包括了const对象的创建、删除及应用实例,需要的朋友可以参考下
    2014-10-10
  • 将正小数转化为2-9进制小数的实现方法

    将正小数转化为2-9进制小数的实现方法

    本篇文章对正小数转化为2-9进制小数的实现方法进行了介绍,需要的朋友参考下
    2013-05-05
  • OpenCV 通过Mat遍历图像的方法汇总

    OpenCV 通过Mat遍历图像的方法汇总

    对图像中的所有点或特殊点进行运算,所以遍历图像就显得很重要,如何高效的遍历图像是一个很值得探讨的问题,本文给大家带来了多种方法操作OpenCV 通过Mat遍历图像,感兴趣的朋友一起看看吧
    2022-02-02

最新评论