写好最简单的插入排序

直接插入排序,也是很常见的算法,每本数据结构的书上应该都有这个算法,如果没有,你就扔了这本书吧,换一本吧

直接插入排序,为什么取这个名字?

直接插入排序取这个名字,也是很容易理解的,每次都是取出一个元素,插入前面已经排好序的元素中,重复上述的步骤,直至整个序列变成有序序列。

直接插入排序的算法思路:

1:将数组中的第一个元素当做有序序列,这时的有序序列中只有一个元素

2:将第二个元素插入到前面的有序序列,最终的结果仍然是一个有序序列,此时序列为长度为2个元素

3:将第三个元素插入到前面的有序序列中,最终结果仍然是一个有序序列,序列长度为3个元素

4:对后面的元素做同样的操作,第N-1次插入后,数组将变成有序序列。

时间复杂度

最坏情况下,假设是从小到大排序,此时数组是一个逆序序列,则总共需要(说明不带哨兵情况下,且不计算越界操作时)(n-1)*n/2,需要的移动操作为(n-1)*n/2+(n-1)次,最好的情况下是序列已经牌有序的情况下,此时的比较次数为n-1次,移动的次数为0次,因此平均的时间复杂度为O(n^2)

空间复杂度:

算法的空间复杂度,因为需要一个元素做为交换,故需要O(1)

算法的稳定性

直接插入排序算法,因为将元素插入到有序序列时是从有序序列的最后一个位置向前寻找插入位置的,因些算法是稳定的。

不带哨兵的直接插入排序

void InsertSort(int *a ,int N)
{
	int tmp;
	for(int i=1;i<N;i++)
	{
		tmp=a[i];
		for(int j=i-1;j>=0&&a[j]>tmp;j--)
				a[j+1]=a[j];
		a[j+1]=tmp;//其实这里前面应该有一个if(j+1!=i)更好
	}
}
带哨兵的直接插入排序

//假设a中第一个元素当做哨兵,即a[0]
void InsertSort(int *a ,int N)
{
	for(int i=1;i<N;i++)
	{
		a[0]=a[i];
		//有了哨兵元素后,可以发现不用判断是否到达第一个元素,即j>=0
		for(int j=i-1;a[j]>a[0];j--)
				a[j+1]=a[j];
		a[j+1]=a[0];//其实这里前面应该有一个if(j+1!=i)更好
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值