【数据结构学习笔记】归并的递归算法

源代码

/* 归并排序 */

/* 有序子列归并 
 L = 左边起始位置, R = 右边起始位置, RightEnd = 右边终点位置
 */

 void Merge(ElementType A[], ElementType TmpA[], int L, int R, int RightEnd) {
    LeftEnd = R - 1;        // 左边终点位置,假设左右两列挨着
    Tmp = L;                 // 存放结果的数组的初始位置
    NumElements = RigthEnd - L + 1; 

    while (L <= LeftEnd && R <= RightEnd) {
        if (A[L] < A[R]) {
            TmpA[Tmp++] = A[L];
        }
        else {
            TmpA[Tmp++] = A[R];
        }
    }

    if (L == LeftEnd) {
        for (L; L <=LeftEnd; L++) {
            TmpA[Tmp++] = A[L];
        } 
    }

    while (L <= LeftEnd) {
        TmpA[Tmp++] = A[L++];
    }
    while (R <= RightEnd) {
        TmpA[Tmp++] = A[R++];
    }
 }

 /* 递归算法 */
 void MSort (ElementType A[], ElementType TmpA[], int L, int RightEnd) {
     int Center;

    if (L < RightEnd) {
        Center = (L + RightEnd) / 2;
        MSort(A, TmpA, L, Center);
        MSort(A, TmpA, Center+1, RightEnd);
        Merge(A, TmpA, L, Center+1, RightEnd);
    }
 }

统一函数接口

/* 递归算法统一函数接口 */

void Merge_sort (ElementType A[], int N) {
    ElementType *TmpA;
    TmpA = malloc(N * sizeof(ElementType));
    if (Tmp != NULL) {
        MSort(A[], Tmp[], 0, N-1);
        free(TmpA);
    }
    else Error("Not enough space!");
}

Tips:

  • 为什么MSort()和Merge()函数时,参数里有TmpA[]临时数组,而不是在函数里临时创建呢?
    在统一函数接口Merge_sort()里定义好TmpA后,每次调用函数TmpA[]地址都不变,排好序之后可以free掉,而在子函数中临时创建,需要多次申请空间然后释放空间,效率低。
posted @ 2017-08-24 13:17  J_yuhao  阅读(128)  评论(0编辑  收藏  举报