每天一算法,我是IT人生 --合并排序

上篇学习了插入算法,这是一种增量方法以,这篇学习的是分治法中的一种。

  2.合并排序

void merge( int *a,int startnum,int midnum,int endnum )
{
    int n1 = midnum - startnum + 1;
    int n2 = endnum - midnum ;

    int *a1 = (int *)malloc((n1+1)*sizeof(int));
    int *a2 = (int *)malloc((n2+1)*sizeof(int));

    for( int i=0;i<n1;++i) a1[i] = a[startnum+i];
    for( int i=0;i<n2;++i) a2[i] = a[midnum+1+i];

    a1[n1] = 100000;//这里理论上是无究大值,这里只给了一个较大的数据
    a2[n2] = 100000;
    int i=0;
    int j=0;

    for( int k= startnum;k<=endnum;++k)
    {
        if( a1[i]<=a2[j])
        {
            a[k] = a1[i];
            ++i;
        }
        else
        {
            a[k] = a2[j];
            ++j;
        }
           
    }
    free(a1);
    free(a2);
}

 

void merge_sort( int *a,int startnum,int endnum )
{
    if( startnum < endnum )
    {
        int q = ( startnum+endnum )/2;

        merge_sort( a,startnum,q);

        merge_sort( a,q+1,endnum );
         

       merge(a,startnum,q,endnum );

    }

}

 

时间复杂度:

测试10000个范围(0,100)的随机数值,结果如下:

实际值:

合并排序:                               插入排序:

starttime1.437s                starttime1.421s          

 endtime1.468s                endtime1.593s

using time0.031s             using time0.172s

 理论值:

 O( nlogn )                                   O(n2)                                 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值