算法描述:内排序的一种,分为简单插入排序和SHELL排序,本例为第一种平云复杂度n^2。适用于待排数较少的情况。
分析:想想平时打扑克,每当拿起一张新牌,要比较手上牌的顺序选择一个较为合适的位置插入,本算法就跟那情况类似。选定待排序的第二个数开始和左边比较插入,如果比左边的小则交换(降序排列),依次比较到第一个数。这样一次迭代完成整个排序序列。
代码:
#include <stdio.h>
/*
算法伪代码,摘至算法导论(插入排序):
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;
*/
void Insort(int s[], int len)
{
int i,j,key= 0,index;
for (i = 1; i < len; i ++)
{
key = s[i];
j = i - 1;
while (j >= 0 && s[j] > key) //迭代条件:当前待排的数Si与之前S0~Si-1进行逐一比较
{
s[j + 1] = s[j]; //如果满足带插入位置的数比待排数大,则交换俩者位置
j = j - 1; //每次向前推进一个数
}
s[j + 1] = key; //还原之前待排的关键字
printf("第%d趟排序结果: ",i);
for (index = 0; index < 10; index ++)
printf("%d ",s[index]);
printf("\n");
}
}
int main ()
{
int a[10] = {25,12,36,45,2,9,29,25,1,0};
int i;
printf("待排序列: ");
for (i = 0; i < 10; i ++)
printf("%d ",a[i]);
printf("\n");
Insort(a, 10);
printf("序列结果: ");
for (i = 0; i < 10; i ++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
运行结果:
shell排序:http://blog.csdn.net/huazhen1234/article/details/53897710
关于测试数据生成我写了个小代码:http://blog.csdn.net/huazhen1234/article/details/53896153