排序算法之直接插入(C/C++实现)

void InsertSort(int nArr[], int nLen)
{
	int i, j;
	int nTemp;

	for (i = 1; i < nLen; ++i)
	{
		nTemp = nArr[i];//取出一个要插入的元素
		for (j = i - 1; j >= 0 && nTemp < nArr[j]; j--)
		{
			nArr[j + 1] = nArr[j];//要插入的元素比前一个元素小,则前一个元素后移
		}
		//直到比前一个元素大时,将次元素放置全一个元素位置处
		nArr[j + 1] = nTemp;
	}
}

例如:int nArr[5] = {2,4,5,3,1}; 则
(1)24531 要插入元素为4
(2)24531 要插入元素为5
(3)24551 要插入元素为3
24451
23451
(4)23455 要插入元素为1
23445
23345
22345
12345
(1)(2)(3)(4)(5)表示最外层循环序号,序号之间的内容为内层循环时数组的内容变化

算法思想上例中每次最外层大循环,nTemp为选取要插入的元素,要插入的元素比前一个元素小,则前一个元素后移,最后找到比前一个元素大的位置插入即可,依次类推。每次循环从后向前依次比较,因此第一次循环时i = 1,取出第二个元素(要放置插入的元素)与第一个对比, 依次类推,最终找到不大于前一个元素的位置,放置此元素
解析:nArr[i-1]为已经排序好的元素,取出下一个要插入的元素nTemp=nArr[i]依次与倒序nArr[j] nArr[j-1]…比较, 若遇到nTemp<nArr[j],则将nArr[j]向后移动,为nArr[j+1]=nArr[j],依次类推,直到nTemp>=nArr[j], 则将元素插入到nArr[j]位置(由于存在最后一个j–,故需要nArr[j+1] = nTemp)

时间复杂度:最好情况下,顺序已从小到大排好,只需对比n-1次,为O(n)
最坏情况下,顺序从大到小排列,需要对比1 、2、3、、、n-1次,合计n(n-1)/2,为
O(n^2 )
空间复杂度:无需额外空间,即为O(1)

由时间复杂度可看出,排序元素比较少的时候很好,大量元素便会效率低下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值