【數據結構學習筆記】歸併的遞歸算法

源代碼

/* 歸併排序 */

/* 有序子列歸併 
 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掉,而在子函數中臨時建立,須要屢次申請空間而後釋放空間,效率低。
相關文章
相關標籤/搜索