排序算法 - 插入排序

插入排序,简而言之,就是对于第i个数,前i-1个数是已排序的,第i个数则要从第i-1个数开始往前遍历,比较大小,比它大的往后移一位,比它小的则其后为要的插入的位置,则在此处插入即可。插入后会发现前i个数都变成已排序的了(此处应注意体会)。于是依此类推插入第i+1个数。此方法最坏的时间复杂度也会达到O(n^2)的。

例如初始序列:

34 8 64 51 32 21

第一趟插入:8 34 64 51 32 21(默认第一个数是有序的,则待插入的是第二个数8,显然8小于第一个数,因此插入在34的前面)

第二趟插入:8 34 64 51 32 21(此时前两个数是有序的,则带插入的是第三个数64,显然34比64要小,则无需插入)

第三趟插入:8 34 51 64 32 21(此时前三个数是有序的,则带插入的是第四个数51,显然51比64要小,比34大,则插入至34和64之间)

第四趟插入:8 32 34 51 64 21(此时前四个数是有序的,则带插入的是第五个数32,显然32比34要小,比8大,则插入至34和8之间)

第五趟插入:8 21 32 34 51 64(此时前五个数是有序的,则带插入的是第六个数21,显然21比32要小,比8大,则插入至32和8之间)

五趟插入后,整个序列都是有序的了。因此n个数,至少需要n-1趟插入。

算法实现:

/*直接插入排序法*/
#include<stdio.h>

void InsertSort(int *data,int N);

int main()
{
    int i=0;
    int data[6]={34,8,64,51,32,21};
    printf("Before Sort:\n");
    for(i=0;i<6;i++)
    {
        printf("%d\t",data[i]);
    }
    InsertSort(data,6);
    printf("\nAfter Sort:\n");
    for(i=0;i<6;i++)
    {
        printf("%d\t",data[i]);
    }
    return 0;
}

void InsertSort(int *data,int N)
{
    int i=0,j=0;
    int tmp=0;

    for(i=1;i<N;i++)
    {
        tmp=data[i];//待插入的值
        for(j=i;j>0 && data[j-1]>tmp;j--)//在已排序数组中从后往前遍历,直到找到插入的位置j
            data[j]=data[j-1];
        data[j]=tmp;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值