排序----插入排序

        一开始把第一个元素看成是有序的,然后从第二个元素开始拿出来与前面的数据比较,若前面的数据小,就把前面的数据不断后移(注意要把拿出来的那个元素提前保存下来),直到遇到比自己小的元素,然后插入到它的后面。再拿出第三个元素来,之后依次拿出来与前面相比较。这样就保证了拿出来的元素之前的所有元素都是有序的。

时间复杂度:

最坏O(N^2)------>此时原数组为逆序排列

最好O(N)--------->此时原数组顺序有序

//为什么tmp最后赋值要放在循环外面?

看下面这张图,1插入的过程中end不断--,end最后等于-1,但是循环可以进行的条件是end>=0,所以会提前结束然后tmp并没有保存到下标为0的位置,这样就错了。

//注意外部循环i是从0到n-2,因为你要拿出来的元素是从1到n-1,拿出来的元素下标为end+1,由此可以得出end的取值范围i

void InsertSort(int* a, int n)
{
	//  [0, n-1]
	for (int i = 0; i < n-1; i++)
	{ 
		// [0,end]有序 end+1位置的值插入[0,end],保持有序
		int end = i;
		int tmp = a[end + 1];
		while (end >= 0)
		{
			if (tmp < a[end])
			{
				a[end + 1] = a[end];
				--end;
			}
			else
			{
				break;
			}
		}
		a[end + 1] = tmp;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值