算法:插入排序

通俗解释:当你在操场站队的时候,要从矮到高排队,假设你前面的同学已经是排好的高矮顺序,然后,老师把你拎出来(value=p[i]),然后将你和你前面的同学逐个比较高矮,比你高的同学往后移动;直到找到适合你的位置,然后再把你插入队伍。

代码如下

void insert(int *p,int num)
{
    int value,i,j;
    for(i=1;i<num;i++)
    {
        value=p[i];
        for(j=i-1;j>=0&&value<p[j];j--)/*循环的条件是j大于等于0,并且value前面的数比它大*/
        {
            p[j+1]=p[j];   /*满足循环条件,说明p[i]比value值大,所以往后移动*/
        }
        p[j+1]=temp;  /*跳出循环,说明找到了比自己小的值,就把它插入到这个值的后面,(或者到底了(此时j=-1)然后p[0]=temp)*/
    }
}

算法复杂度(n*(n+1))/2:O(N^2)

这里写图片描述

插入编程思路,i从1递增,也就是第二个数据开始,然后把p[i]提出来给value,然后p[i]空间就被腾出来,value就是所谓的插入值,逐个往前寻找,直到找到比它小的数据,然后把它插这个是的后面也就是p[j+1]=temp; 程序当中的循环的目的是大数据往后移动,找到我们要的j值

问题:p[j+1]=p[j],确实是把数据往后移动了,但是貌似p[j+1] 被冲掉了,看似数据丢失了

答:其实p[j+1]上一轮比较的时候已经往后面移动了,所以这次比较的时候,相当于p[j+1]已经是被腾出来了(也就是空的)可以作为一个待填补空间

猜你喜欢

转载自blog.csdn.net/shenlong1356/article/details/80472226