排序算法(一) -- 插入排序

插入排序


首先,对排序算法
输入: n 个数 <a1, a2, ... ,an>
输出:序列的一个排序<a1',a2',...,an'>, 使得a1'<=a2'...<=an'.
待排序的数为key

插入排序算法,是一个对少量元素进行排序的有效算法.

其伪代码如图:



插入排序算法在形式上类似于我们平时打牌时,边抽牌边整理扑克牌的顺序,我们将新的牌与手中已经整理好顺序的扑克牌进行比较,最终将抽到的牌放置在一个合理的位置。 如下图:

A = <5, 2, 4, 6, 1, 3>的排序过程,黑色的方块表示key,灰色表示已经排好顺序的


由图可知,每个key在开始排序时,从已排序的元素中的最后一个元素开始比较,直到找到比key小的元素时,将key插入这个元素之后。

代码仅实现算法描述的功能。为了避免混淆,代码中的变量声明尽量与算法描述中的声明一致。

程序代码
/*
插入排序算法的非递归实现
*/

void InsertSort(int A[], int n)
{
	int i, key ; // A[1~i]表示已经排好序的数组,i为位置标记
	for(int j = 1; j < n; j++)   // j为迭代变量,遍历整个数组
	{
		key = A[j];
		//InsertA[j]into the sorted sequence A[1..j-1]
		i = j-1; // 标记已经排好顺序的数组的位置
		
		// 如果i不是第一个元素(C++表示的数组中第一个元素为A[0])
		// 并且A[i]的值大于key, 则后移A[i]中的值,
		// 同时位置标记前移,直到找打比key小的元素位置
		while(i >= 0 && A[i] > key)
		{
			A[i+1] = A[i];  // 后移A[i]中的值
			i = i-1; // 位置标记前移
		}
		A[i+1] = key;
	}	
}


测试结果:



算法分析:
插入排序使用增量的方法,在已经排好子数组A[1..j-1]后,将A[j]插入,形成排好序的字数组A[1..j]. 插入排序法在排序的过程中不用申请新空间。但是每插入一个key,已排好序的元素大于key的部分就要向后移动。如果数据量很大或者数组倒序排列,移动次数会非常多。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值