归并排序MergeSort

/**
 *归并排序思路:分治法思想  O(nlogn)
 *        把数组一分为二,二分为四
 *         四和为二,二和为一
 *        
 */

/**
 * 归并排序主方法
 *@params   待排序的数组
 *@params   初始位置
 *@params   最终位置
 */

public  class  MergeSort
{
    public  static  void   mergeSort(int[] resouceArr, int  begin  ,  int  end )
    {
        if  ( begin  <   end  )    
        {
            int  middle  = ( begin + end ) / 2 ;
            mergeSort( resouceArr ,  begin  ,  middle );
            mergeSort( resouceArr ,  middle + 1 , end );
            _merge( resouceArr , begin , middle , end );
        }
    }
    /**
     *合并两个已经排好序数组的方法
     *由mergeSort()调用,定义为private,命名以下划线开头
     */
    private  static  void  _merge(int[] arr  ,  int  begin  ,  int  middle  ,  int  end  )
    {
        //获得左数组大小,右数组大小
        int  leftArrLength  =  middle -  begin  +  1 ; 
        int  rightArrLength =  end  -  middle  ;
        //申请空间
        int[] leftArr = new int[leftArrLength + 1];
        int[] rightArr = new int[rightArrLength + 1];
        //初始化数组的值(把原数组的值一个一个复制quickArr到新数组中)
        for( int i = 0  ; i  <  leftArrLength  ;  i++)
        {
            leftArr[i] = arr[begin + i] ;
        }    
        for( int j = 0  ; j  <  rightArrLength ;  j++)
        {
            rightArr[j] = arr[middle + j + 1] ;
        }
        //哨兵,放在最后
        leftArr[leftArrLength] = 65536 ;
        rightArr[rightArrLength] = 65536 ;

        int  i  =  0  ;  
        int  j  =  0  ; 
        for(int k = begin ; k <= end  ;  k++ )
        {
            if( leftArr[i] <= rightArr[j] )
            {
                arr[k] = leftArr[i] ;
                i = i + 1 ; 
            }
            else
            {
                arr[k] = rightArr[j];
                j = j + 1 ; 
            }            
        }    
    }    
}

 

posted @ 2013-11-04 19:04  天蓝印象  阅读(204)  评论(0编辑  收藏  举报