递归实现
public class MergeSort {
private static void merge ( Integer[ ] a, Integer[ ] aux, int lo, int hi, int mid) {
for ( int k = lo; k <= hi; k++ )
aux[ k] = a[ k] ;
int i = lo;
int j = mid + 1 ;
for ( int k = lo; k <= hi; k++ ) {
if ( i > mid) a[ k] = aux[ j++ ] ;
else if ( j > hi) a[ k] = aux[ i++ ] ;
else if ( aux[ i] < aux[ j] ) a[ k] = aux[ i++ ] ;
else a[ k] = aux[ j++ ] ;
}
}
public static void sort ( Integer[ ] a, Integer[ ] aux, int lo, int hi) {
if ( hi <= lo) return ;
int mid = ( hi + lo) / 2 ;
sort ( a, aux, lo, mid) ;
sort ( a, aux, mid + 1 , hi) ;
merge ( a, aux, lo, hi, mid) ;
}
public static void sort ( Integer[ ] a) {
Integer[ ] aux = new Integer [ a. length] ;
sort ( a, aux, 0 , a. length - 1 ) ;
}
}
循环实现
public class MergeSort {
private static void merge ( Integer[ ] a, Integer[ ] aux, int lo, int mid, int hi) {
for ( int k = lo; k <= hi; k++ )
aux[ k] = a[ k] ;
int i = lo;
int j = mid + 1 ;
for ( int k = lo; k <= hi; k++ ) {
if ( i > mid) a[ k] = aux[ j++ ] ;
else if ( j > hi) a[ k] = aux[ i++ ] ;
else if ( aux[ i] < aux[ j] ) a[ k] = aux[ i++ ] ;
else a[ k] = aux[ j++ ] ;
}
}
public static void sort ( Integer[ ] a) {
int N = a. length;
Integer[ ] aux = new Integer [ N] ;
for ( int sz = 1 ; sz < N; sz = sz + sz)
for ( int lo = 0 ; lo < N - sz; lo += sz + sz)
merge ( a, aux, lo, lo + sz - 1 , Math. min ( lo + sz + sz - 1 , N - 1 ) ) ;
}
}