归并排序算法

使用数组结构,自顶向下算法。

//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中
//lPos到rPos-1为一端,rPos到rEnd为另一端
void Merge(int a[], int tmp[], int lPos, int rPos, int rEnd)
{
    int i, lEnd, NumElements, tmpPos;
    lEnd = rPos - 1;
    tmpPos = lPos;                   //从左端开始
    NumElements = rEnd - lPos + 1;   //数组长度
    
    While(lPos <= lEnd && rPos <= rEnd)
   {
        if(a[lPos] <= a[rPos])             //比较两端的元素值
            tmp[tmpPos++] = a[lPos++];     //把较小的值放在tmp临时数组
        else
            tmp[tmpPos++] = a[rPos++];
    }

    //到这里,左端或者右端只能有一端还可能含有剩余元素
    while(lPos <= lEnd)   //把左端剩余的元素放入tmp
        tmp[tmpPos++] = a[lPos++];
    while(rPos <= rEnd)   //把右端剩余的元素放入tmp
        tmp[tmpPos++] = a[rPos++];

    for(i = 0; i < NumElements; i++, rEnd--)
        a[rEnd] = tmp[rEnd];  //把临时数组拷贝到原始数组
}

void msort(int a[], int tmp[], int low, int high)
{
    if(low >= high) //结束条件,原子结点return 
        return;

    int middle = (low + high)/2;    //计算分裂点
    msort(a, tmp, low, middle);     //对子区间[low, middle]递归做归并排序
    msort(a, tmp, middle + 1; high);//对子区间[middle + 1, high]递归做归并排序
    Merge(a, tmp, low, middle + 1, high);  //组合,把两个有序区间合并为一个有序区
}

void merge_sort(int a[], int len)
{
    int* tmp = NULL;
    tmp = new int[len];              //分配临时数组
    if(tmp != NULL)
    {
         msort(a, tmp, 0, len - 1); //调用msort归并排序         
         delete []tmp;    //释放临时数组内存
    }
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值