归并排序的过程就是假设子数组A[p..q]和 A[q + 1 .. r ]都是排好序的,并将它们合并成一个已排好序的子数组代替当前数组A[p..r]。
这个过程是在函数MEGRE中实现。
MEGRESORT 函数是对子数组A[p..r]进行排序。若p >= r,则该子数组中至多只有一个元素,当然就是已排好序的。否则,分解步骤就计算出一个下表q,将a[p..r]分成a[p..q] 和a[q + 1..r],各含 >= n/2个元素。
#include <stdio.h>
#include <string.h>
const int MAXN = 100000000;
void MERGE ( int *a, int p, int q, int r ) {
int n1 = q - p + 1;
int n2 = r - q;
int L[n1 + 1], R[n2 + 1];
int i, j, k;
for ( i = 1; i <= n1; ++i )
L[i] = a[p + i - 1];
for ( j = 1; j <= n2; ++j )
R[j] = a[q + j];
L[n1 + 1] = MAXN;
R[n2 + 1] = MAXN;
i = 1;
j = 1;
for ( k = p; k <= r; ++k ) {
if ( L[i] <= R[j] ) {
a[k] = L[i];
i++;
}
else {
a[k] = R[j];
j++;
}
}
}
void MERGESORT ( int *a, int p, int r ) {
if ( p < r ) {
int q = ( r + p ) / 2;
MERGESORT ( a, p, q );
MERGESORT ( a, q + 1, r );
MERGE ( a, p, q, r );
}
}
int main ( ) {
int n, a[10000];
while ( scanf ( "%d", &n ) != EOF ) {
for ( int i = 1; i <= n; ++i )
scanf ( "%d", &a[i] );
MERGESORT ( a, 1, n );
for ( int i = 1; i <= n; ++i )
printf ( "%d ", a[i] );
printf ( "\n" );
}
}