归并排序

递归算法:

void Merge(int *dataArray,int start, int p, int end)

{

    int lsize=p-start,rsize=end-p;//两个数组的大小

    int *l = new int[lsize], *r = new int[rsize];//要合并的两个数组

    memcpy(l,dataArray+start,sizeof(int)*lsize);

    memcpy(r,dataArray+p,sizeof(int)*rsize);//将要合并的数组复制

    int lnow=0,rnow=0,i;//未合并的数字的位置

    for(i=0;lnow<lsize&&rnow<rsize;i++)

    {

        if(l[lnow]<r[rnow])//取较大的数

        {

            dataArray[start+i]=l[lnow];

            lnow++;

        }

        else

        {

            dataArray[start+i]=r[rnow];

            rnow++;

        }

    }

    if(lnow==lsize&&rnow!=rsize)//其中一个数组合并完以后,复制剩下的数据

    {

        memcpy(dataArray+start+i,r+rnow,sizeof(int)*(rsize-rnow));

    }

    else if(rnow==rsize&&lnow!=lsize)

    {

        memcpy(dataArray+start+i,l+lnow,sizeof(int)*(lsize-lnow));

    }

    delete l;

    delete r;//清理内存

 

}

//排序函数time:O(nlgn)

void merge_sort(int* dataArray,int start,int end)

{

    if(end-start>1)//当元素个数为1时直接返回

    {

        int p = (start + end) / 2;//切割数组

        merge_sort(dataArray, start, p);

        merge_sort(dataArray, p, end);//分别排序

        Merge(dataArray,start, p, end);//合并数组

   //     print_array(dataArray, end);

    }

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值