直接插入排序(straight insertion sort)的做法是:
1、每次从无序表中取出第一个元素,把它插入到有序表的合适位置,使有序表仍然有序。
第一趟比较前两个数,然后把第二个数按大小插入到有序表中; 第二趟把第三个数据与前两个数从后向前扫描,把第三个数按大小插入到有序表中;依次进行下去,进行了(n-1)趟扫描以后就完成了整个排序过程。
直接插入排序是由两层嵌套循环组成的。外层循环标识并决定待比较的数值。内层循环为待比较数值确定其最终位置。直接插入排序是将待比较的数值与它的前一个数值进行比较,所以外层循环是从第二个数值开始的。当前一数值比待比较数值大的情况下继续循环比较,直到找到比待比较数值小的并将待比较数值置入其后一位置,结束该次循环。
插入排序的基本方法是:每步将一个待排序的记录按其关键字的大小插到前面已经排序的序列中的适当位置,直到全部记录插入完毕为止。
2、假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。
3、插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。
#include<stdio.h>
void insort(int s[],int n)
{
int i,j;
for(i=2;i<=n;i++)//数组下标从2开始,s[0]做监视哨,s[1]一个数据无可比性。
{
s[0]=s[i];//给监视哨赋值
j=i-1;//确定比较元素的最右边位置
while(s[0]<s[j])
{
s[j+1]=s[j];//数据右移
j--;//移向左边一个为比较的数
}
s[j+1]=s[0];//在确定的位置插入s[i]
}
}
void main()
{
int a[11],i;
printf("请输入10个数:\n");
for(i=1;i<=10;i++)
{
scanf("%d",&a[i]);
}
printf("请输入原始数据\n");
for(i=1;i<11;i++)
{
printf("%3d",a[i]);
}
insort(a,10);
printf("\n排序后的结果:\n");
for(i=1;i<11;i++)
{
printf("%3d",a[i]);
}
printf("\n");
}