源代码
/* 归并排序 */
/* 有序子列归并
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掉,而在子函数中临时创建,需要多次申请空间然后释放空间,效率低。