归并排序算法

来源:互联网 发布:java常用设计模式详解 编辑:程序博客网 时间:2024/06/06 00:03

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

//将分治的两端按大小次序填入临时数组,最后把临时数组拷贝到原始数组中//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