排序一 直接插入排序

基本思想

当插入第i (i  >= 1)个对象时,前面的i - 1 项 元素已经排序完成,这时 用 第 i 项 和 前面的 i -1 项进行比较,然后把插入的位置后面的元素后移一位 ,再 插入该位置。

 

实现一趟排序的步骤:

   找位置 -->    移位    -->    插入数据

 

实现代码:

 

void InsertSort(int* arr , size_t size)
{
	assert(arr);
	for (int i = 1; i < size; i++)
	{
		//插入第i个元素
		int temp = arr[i];
		int end = i - 1;
		//找到存放的位置
		while (end >= 0 && temp < arr[end])
		{
			arr[end + 1] = arr[end];
			--end;
		}
		//存放数据
		arr[end + 1] = temp;
	}
}

 

 

直接插入排序的思路其实就这么简单 , 实现的代码也很容易 。那我们就分析它的时间复杂度、空间复杂度和算法的稳定性

 

时间复杂度

 

当数据正序时,执行效率最好,每次插入都不用移动前面的元素,时间复杂度为O(N)。 

当数据反序时,执行效率最差,每次插入都要前面的元素后移,时间复杂度为O(N^2)

所以,数据越接近正序,直接插入排序的算法性能越好

 

空间复杂度

我们在排序过程中,需要一个临时变量存储要插入的值,所以空间复杂度为 1 

 

 

 

 

 

算法稳定性

在直接插入排序的过程中,不需要改变相等数值元素的位置,所以它是稳定的算法。 

 

 

 

适应条件:

1、数据量较小 ; 2、数据接近有序
 

扩展:

直接插入排序,我们能够进一步优化。首先,能想到的就是,利用二分法找数字会不会快一点呢?这就要讲到 折半插入排序,我会在下一篇博客进一步介绍 。 然后,还有其他的想法么?那我们能不能把这一组数据分为若干小组,每次跳着排序,也就是希尔排序,具体做法也会在后面一一介绍。

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值