package eighty;
public class Guibingshangxiangxia {
public static void main(String[] args) {
//自底向上的归并排序
//对于长度为N的任意数组,自底向上的归并排序需要1/2NlgN至NlgN次比较,最多访问数组6NlgN次。
int[] a = {33,21,51,124,86,781,326,56,63,94};
int N = a.length;
for( int sz = 1 ; sz < N ; sz = sz + sz ) {
for( int ho = 0 ; ho < N - sz ; ho = ho + sz + sz) {
merge( a , ho , ho + sz -1 , Math.min(N-1, ho+sz+sz-1));
}
}
for(int i = 0 ; i < N ; i ++) {
System.out.print(a[i]+" ");
}
}
public static void merge(int[] a , int lo , int mid , int hi) {
int[] aux = new int[a.length];
for(int i = lo ; i <=hi ; i ++) {
aux[i]=a[i]; //定义一个数组用来复制原来的数组,原来的数组则进行存放排序之后的数组
}
int i = lo;
int j = mid + 1;
//System.out.println(i+"*"+j);
for(int t = lo ; t <= hi; t ++) {
if( i > mid)
a[t] = aux[j ++]; //当左边的元素都已经归并完了,则将右边所有元素进行归并
else if(j > hi)
a[t] = aux[i ++]; //当右边所有的元素都已经归并完了,则将左边所有元素进行归并
else if(aux[i] < aux[j])//当左边的元素较小时,则将左边的元素归并到数组中
a[t] = aux[i ++];
else
a[t] = aux[j ++];
}
}
}