归并排序
1、归并排序之原地归并
template< class T >
void merge( T *a, int lo, int mid, int hi ) {
int i = lo, j = mid + 1;
for( int k = lo; k <= hi; k++ ) {
aux[k] = a[k];
}
for( k = lo; k <= hi; k++ ) {
if( i > mid ) a[k] = aux[j++];
else if( j > hi ) a[k] = aux[i++];
else if( aux[j] < aux[i] ) a[k] = aux[j++];
else a[k] = aux[i++];
}
}
2、归并排序之自顶向下的归并排
template< class T >
void sort( T *a, int lo, int hi ) {
if( lo >= hi )
return;
int mid = lo + ( hi - lo )/2;
sort( a, lo, mid );
sort( a, mid+1, hi );
merge( a, lo, mid, hi );
}