Bootstrap

C语言实现插入算法

相信大家都玩过斗地主,我们在整理自己的手牌的时候,大多数人都会选择先整理好自己的一部分牌,再对剩下的手牌一一比较,逐个插入到我们已经整理好的手牌里,这就用到了插入算法。

源代码如下:

#include<stdio.h>
void insertsort(int *a,int n)
{
    for(int i=1;i<n;i++)
    {
        int j=0;
        while(a[j]<a[i]&&j<i)
        {
            j++;
        }
        if(i!=j)//j<i,这个a[j]>a[i] 
        {
            int key=a[i];//先保存a[i]的值
            for(int k=i;k>j;k--)
            {
                a[k]=a[k-1];
             } 
             a[j]=key;
        }
    }
}
int main(void)
{
    int a[10]={6,7,8,9,10,5,3,4,2,1};
    insertsort(a,10);
    int i;
    for(i=0;i<10;i++)
    {
        printf("%d ",a[i]);
    }
}

程序的输出如下:

 下面是对于代码的讲解:

 第一轮插入算法时,我们就把最左边的第一个数字当作已经排序好的手牌,接下来,我们要将剩下的手牌逐一插进去,第一个进行比较的就是a[1],也就是第二张牌了。所以,我们的i从1开始,

j=0,我们用这个变量代表已经排好序的手牌。

现在,我们开始用第i+1张牌,对之前的排好序的手牌进行比较,由于我们手牌的顺序是从小到大,所以我们判断的条件是a[j]要小于a[i],如果a[j]>a[i],说明我们排好序的手牌中有一张牌及其之后的牌都大于我们想要插入的牌!循环结束,或者i=j,说明所有已经排好序的牌都小于我们想要插入的手牌,此时的排序正确,循环结束。

 现在,我们对循环退出的情况进行一个判断,如果i!=j,说明不是第二种情况(不用进行额外排序)

我们要将a[i]的值插入到原来a[j]的地方上去,就要让a[j]及其之后的值往后稍稍,给a[j]留一个位置。所以,我们将a[j]及其之后的值往后移一个位置,再将a[i]的值放到原来a[j]的位置上去

;