基础算法 —— 合并排序(分治法)

参考书籍:《算法导论》第二版


基础算法 —— 合并排序算法(分治法)的宗旨是将问题 “分解”、“处理”、“归并”。将书中的伪代码翻译为C/C++语言实现,

大致可用两个函数来解决问题,第一个函数实现 “治”(也就是分解问题,处理问题)的步骤,另一个函数通

过递归实现 “分、合“ 的操作。


实现 “分、治” 的函数实现如下:


void Merge(int *_pArray, int _start, 
                         int _segmentationPoint, 
                         int _end)
{
    int _leftArrayNum  = _segmentationPoint - _start + 1;
    int _rightArrayNum = _end - _segmentationPoint;
    
    int i = 0;
    int j = 0;

    int *_pLeft  = new int[_leftArrayNum + 1];
    int *_pRight = new int[_rightArrayNum + 1];

    // 分配空间失败
    if( !_pLeft || !_pRight )
        return;

    // 数据写入新数组
    for(i = 0; i < _leftArrayNum; i++ )
        _pLeft[i] = _pArray[_start + i];
    for(j = 0; j < _rightArrayNum; j++ )
        _pRight[j] = _pArray[_segmentationPoint + j + 1];

    // 末尾的哨兵值
    _pLeft[_leftArrayNum] = 99999;
    _pRight[_rightArrayNum] = 99999;

    i = 0;
    j = 0;

    // 将分割并排序后的两个数组值重新写入原始数组
    for( int k = _start; k <= _end; k++ )
    {
        if( _pLeft[i] < _pRight[j] )
        {
            _pArray[k] = _pLeft[i];
            i++;
        }

        else
        {
            _pArray[k] = _pRight[j];
            j++;
        }
    }

    delete []_pLeft;
    delete []_pRight;
    _pLeft  = NULL;
    _pRight = NULL;
}



实现 ”合并“ 的函数实现如下:

void Merge_Sort(int *_pArray, int _start, int _end)
{
    // 如果子数组中起始位置大于/等于末端位置,
    // 即_start >= _end,表明该数组中至多存在
    // 一个元素,所以即可被称作 “已排序”。
    if( _start < _end )
    {
        int _segmentationPoint = (_start + _end) / 2;
        Merge_Sort(_pArray, _start, _segmentationPoint);
        Merge_Sort(_pArray, _segmentationPoint + 1, _end);
        Merge(_pArray, _start, _segmentationPoint, _end);
    }
}

PS:在递归过程中,逐渐将数组元素分解为单个,两个,最后组合成员是数组,

我认为难点在于对递归过程的理解相当抽象,最好能在纸上做一下笔记,以便于

理解。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值