首页 > 编程语言 > 详细

排序算法——插入排序

时间:2015-04-27 16:59:08      阅读:193      评论:0      收藏:0      [点我收藏+]

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

例如初始序列:

34 8 64 51 3221

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

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

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

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

第五趟插入:8 21 32 34 5164 (此时前五个数是有序的,则带插入的是第六个数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;
    }
}


排序算法——插入排序

原文:http://blog.csdn.net/u010275850/article/details/45310259

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!