歸併排序,至底向上的方法,不會減少複雜度,但是會使程式碼更加簡單
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 ++];
}
}
}