归并排序,至底向上的方法,不会减少复杂度,但是会使代码更加简单

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

猜你喜欢

转载自blog.csdn.net/ZWB626/article/details/84145868