源代碼
/* 歸併排序 */
/* 有序子列歸併
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掉,而在子函數中臨時建立,須要屢次申請空間而後釋放空間,效率低。