参考书籍:《算法导论》第二版
基础算法 —— 合并排序算法(分治法)的宗旨是将问题 “分解”、“处理”、“归并”。将书中的伪代码翻译为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:在递归过程中,逐渐将数组元素分解为单个,两个,最后组合成员是数组,
我认为难点在于对递归过程的理解相当抽象,最好能在纸上做一下笔记,以便于
理解。