使用数组结构,自顶向下算法。
//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中
//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; //释放临时数组内存
}
}