直接插入排序是一种最为简单的排序方法。其基本思想是:在第i次排序中,第i+1个元素与前面的i个元素,进行比较。然后插入到已经有序的数列中的合适的位置。使得插入后的序列任然是保持有秩序的。
例题:编写一个C程序,实现数据序列{{2,5,6,3,7,8,0,9,4,1}的直接插入排序,要求是从小到大,并输出排序后的数列元素。
源程序:
#include <stdio.h>
void insertsort(int a[],int n){
int i,j,tmp;/*tmp是临时变量,用于存储数据*/
for(i=1;i<n;i++)
{
tmp=a[i];/*将k【i】临时保存在变量tmp中*/
j=i-1;
while(j>=0 && tmp<a[j]) /*判断条件,实现从小到大的排序*/
a[j+1]=a[j--];
a[j+1]=tmp;
}
}
void main()
{
int i;
int a[10]={2,5,6,3,7,8,0,9,4,1};/*初始化数组*/
printf("原来的数字的顺序是:");
for(i=0;i<10;i++)
printf("%3d",a[i]);/*输出当前的数组*/
insertsort(a,10);/*插入排序*/
printf("\n排好的顺序是:\n");
for(i=0;i<10;i++)
printf("%3d",a[i]);/*输出排序后的结果*/
getchar();
}
其运行结果是:
这个排序主要是用到一个算法:
void insertsort(int a[],int n)
{
int i,j,tmp;/*tmp是临时变量,用于存储数据*/
for(i=1;i<n;i++)
{
tmp=a[i];/*将k【i】临时保存在变量tmp中*/
j=i-1;
while(j>=0 && tmp<a[j]) /*判断条件,实现从小到大的排序*/
a[j+1]=a[j--];
a[j+1]=tmp;
}
}
这个看起来很简单的几句代码,但是,我是想了好长时间才明白的。关于这个算法的妙处如下图: