c之排序问题---插入排序详解

排序分为很多种方法,下面简要自我概括一下插入排序。

【思路】

所谓插入排序,就是利用插入的方法,将一个无序的数组排列为一个有序的数组。

看了其他博友的代码和一些其他的介绍后,自己总结了一下插入排序是怎样进行的:

       1.在一个数组里存放若干个数据,把array[0]的位置空下,以暂时存放需要插入的数据;

       2.将数组看作是由两个数组组成,在未进行排序时,第一个元素作为有序数组,其余的所有元素作为无序数组。

       3.不断地从无序数组中取出第一个元素按顺序插入到有序数组中去,最后结果是将所有的数据移动到有序数组中,完成排序

【代码及其详解】


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
    int array[4];
    for(int i=1;i<=3;i++){
        scanf("%d",&array[i]);
    }
    int j;
    for(int i=1;i<3;i++){   ///后面有j=i+1,所以必须是留下数组的最后一个值作为无序数组,这样才能使循环进行下去
        j=i+1;    ///假设第一个数就是有序的,则先对第二个数进行插入
        if(array[j]<array[i])///如果无序数组的第一个元素比有序数组的最大值小的话
        {
            array[0]=array[j];   ///就把这个数放入事先没有存放任何数值的array【0】
            while(array[0]<array[i])///当需要插入的数值比有序数组中的最大值小的时候,循环继续,
                                    ///直到找到一个数,插入的值比他大,则插入的值应该放在他后面
            {
                array[i+1]=array[i];///将 插入值来说较大的值往后移动,给插入的值留一个位置,
                                    ///问题:我们要插入的值,是有序数组紧挨着的后面的一个值,
                                    ///当我们把他拿出来放进array【0】中时,就不怕array【i+1】覆盖
                                    ///反而是刚好占用刚刚空下的位置
                i--;///判断继续进行,现在让插入的值与有序数组的倒数第二个值比较,即i会减去一
            }
            array[i+1]=array[0];
                       ///若没有进行while循环,说明array【i】比要插入的值小
                       ///若进行了循环,那么i最后停留在一个位置,那个位置的数值比插入的值小
                       ///因此,最后将要插入的位置放入array【i】的后面,
                       ///这样array【i+1】即是插入的值,他比array【i】要大,但是又比后面的数小
        }
        i=j-1;///经过位置查找这一过程,i就变换了位置,但是我们需要记住有序数组的最后一个位置
              ///因为经过一次的for循环后,在有序数组里有插入了一个新的值,此时i在for循环的结束会通过i++加一
    }
    for(int i=1;i<3;i++)
        printf("%d->",array[i]);
        printf("%d",array[3]);
    return 0;
}

【重点代码部分】


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值