插入排序
首先,对排序算法
输入: 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的部分就要向后移动。如果数据量很大或者数组倒序排列,移动次数会非常多。