排序——插入排序法

插入排序法图示:
插入排序法自己实现的代码:
 
void insertion_sort(int array[], int first, int last)
{
	int index, temp, back;
	
	for(index = first+1; index <= last; index ++)
	{
		temp = array[index];
		for(back = index-1; back >= 0 && temp < array[back]; back --)//1
		{
			array[back+1] = array[back];
		}
		if(back != index-1)//2
		{
			array[back+1] = temp;
		}
	}
}
参考代码:
 void insertion_sort(int array[], int first, int last)
 {
 	int i,j;
 	int temp;
 	for (i = first+1; i<=last;i++)
 	{
 		temp = array[i];
 		j=i-1;
 
 		//與已排序的數逐一比較,大於temp時,該數向後移
 		while((j>=first) && (array[j] > temp))  //当first=0,j循环到-1时,由于[[短路求值]],不会运算array[-1]
 		{
 			array[j+1] = array[j];
 			j--;
 		}
                array[j+1] = temp;	//被排序数放到正确的位置
 
 	}
 }
自己的代码存在的问题:
//1位置:使用back >= 0作为判断条件,无形中对数组的范围做了假设。
//2位置:插入的位置都是这里,这个判断有点多余(虽然说有时候的赋值是没有实际意义的,比如temp比前面的值都大时),相比于判断语句和赋值语句,赋值语句执行效率更高。

插入排序算法的特点:
如果目标是把n个元素的序列升序排列,那么采用 插入排序存在最好情况和最坏情况。最好情况就是,序列已经是升序排列了,在这种情况下,需要进行的比较操作需 (n-1)次即可。最坏情况就是,序列是降序排列,那么此时需要进行的比较共有 n(n-1)/2次。 插入排序的赋值操作是比较操作的次数减去 (n-1)次。平均来说 插入排序算法复杂度为 O(n2)。因而, 插入排序不适合对于数据量比较大的排序应用。但是,如果需要排序的数据量很小,例如,量级小于千,那么 插入排序还是一个不错的选择。 插入排序在工业级库中也有着广泛的应用,在STL的sort算法和stdlib的qsort算法中,都将插入排序作为快速排序的补充,用于少量元素的排序(通常为8个或以下)。
最差时间复杂度:O(n^2)
最优时间复杂度:O(n)
平均时间复杂度:O(n^2)
最差空间复杂度:O(n)(递归实现时),非递归实现时为O(1)
补充: 如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元素的后面。所以,相等元素的前后顺序没有改变,从原无序序列出去的顺序就是排好序后的顺序,所以插入排序是稳定的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值