1. 程式人生 > >歸併排序,至底向上的方法,不會減少複雜度,但是會使程式碼更加簡單

歸併排序,至底向上的方法,不會減少複雜度,但是會使程式碼更加簡單

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 ++];
             }
             
         }
}