直接插入排序基本思路
对于给定的一组记录,初始时假定第一个数是有序序列,其余的按照无序序列;接着从第二个数开始,按照大小插入到之前的有序序列中,直到最后一个数插入到有序序列为止。

图示:
在这里插入图片描述
先假定29这个数是个有序序列,从18往后都是无序的。
这样先用18与29比较(18与有序序列的最后一个数比较),比29小,则先让29后移一位,移到18的位置,再把18移到29的位置,这样前两个就排序完毕。
我们直接跳到第四次比较,有代表性。3先和87比较,比他小,就先把3存起来,87后移一位,接着3和87的前一个数比较,还是小,56也后移一位;再和29比较,还是小;直到与18比完还是小,依旧18后移一位,把3插入到原来18的位置。
如此往后,排序完成。

可以借助下面动态图帮助理解在这里插入图片描述
动态图来自这位博主

分析完毕,接下来上代码

#include <stdio.h>
void InsertSort(int *array, int length)
{
	int i, j, t;
	for(i = 1; i < length; i++)  //从第二个数开始
	{
		t = array[i];         //先把array[i]存起来
		for(j = i - 1; j >= 0; j--)    
		{
			if(array[j] > t)
			{
				array[j + 1] = array[j];  //往后移一个
			}
			else
			{
				break;        //如果if不成立。直接跳出本次for循环
			}
		}
		array[j + 1] = t;   //由于最后一次j循环自减了一次,所以要加一恢复到最后一个j位置。
	}
}

int main()
{
	int array[6] = {29,18,87,56,3,27};
	int i,length;
	length = sizeof(array)/sizeof(array[0]);
	InsertSort(array, length);

	for(i = 0; i < length; i++)
	{
		printf("%d ", array[i]
	}
	printf("\n");
	return 0;
}

稳 定 性:稳定

时间复杂度: O(n^2)
(1)初始数据正序,总比较次数:n-1
(2)初始数据逆序,总比较次数:(n2+n-1)/2= O(n2)
(3)初始数据无序,第i趟平均比较次数(i+1)/2,总次数为:(n2+3n)/4=O(n2)
(4)可见,原始数据越趋向正序,比较次数和移动次数越少。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐