//遞迴方法
/* L = 左邊起始位置, R = 右邊起始位置, RightEnd = 右邊終點位置*/
void Merge( ElementType A[], ElementType TmpA[], int L, int R, int RightEnd )
{ /* 將有序的A[L]~A[R-1]和A[R]~A[RightEnd]歸併成一個有序序列 */
int LeftEnd, NumElements, Tmp;
int i;
LeftEnd = R - 1; /* 左邊終點位置 */
Tmp = L; /* 有序序列的起始位置 */
NumElements = RightEnd - L + 1;//必須記錄個數,因為不是從0到結尾的
while( L <= LeftEnd && R <= RightEnd ) {
if ( A[L] <= A[R] )
TmpA[Tmp++] = A[L++]; /* 將左邊元素複製到TmpA */
else
TmpA[Tmp++] = A[R++]; /* 將右邊元素複製到TmpA */
}
while( L <= LeftEnd )
TmpA[Tmp++] = A[L++]; /* 直接複製左邊剩下的 */
while( R <= RightEnd )
TmpA[Tmp++] = A[R++]; /* 直接複製右邊剩下的 */
for( i = 0; i < NumElements; i++, RightEnd -- )
A[RightEnd] = TmpA[RightEnd]; /* 將有序的TmpA[]複製回A[] */
}
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 MergeSort( ElementType A[], int N )
{ /* 歸併排序 */
ElementType *TmpA;
TmpA = new int[N];
if ( TmpA != NULL ) {
Msort( A, TmpA, 0, N-1 );
free( TmpA );
}
else printf( "空間不足" );
}