插入排序

插入排序对于少量元素的排序,是一个有效的算法。插入排序的工作方式像许多人排序一手扑克牌。开始时我们左手为空并且桌子上的牌面向下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与已在手中的每张牌进行比较,默认拿到左手的牌总是排序好的。
输入:n个数的一个序列<a1,a2,…,an>
输出:输入序列的一个排列<a1’,a2’,…,an’>,且满足a1’ <= a2’ <= …<= an’
算法描述如下

INSERTION-SORT(A)
	for j = 2 to A.length
		key = A[ j ]
		i = j - 1
		while i > 0 and A[i] > key
			A[ i + 1 ] = A[ i ]
			i = i - 1
		A[ i + 1 ] = key

C语言实现如下

void insertion-sort(int *arr, int n)
{
	int i, j, key;
	for( i = 1 ; i < n ; i++ )
	{
		key = arr[i];
		j = i;
		while( j > 0 && arr[ j - 1 ] > key)
		{
			arr[ j ] = arr[ j - 1 ];
			j--;
		}
		arr[ j ] = key;
	}
}

效率
插入排序在最好的情况下,需要比较 n - 1 次,不需要进行交换,时间复杂度为O(n);在最坏的情况下需要比较 n (n-1) / 2 次,故时间复杂度为 O(n^2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值