您的位置:首页 > 其它

归并排序算法

2015-08-07 16:26 471 查看
使用数组结构,自顶向下算法。

//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中
//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;    //释放临时数组内存
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: