合并排序

package cn.cnooc.algorithm;
/**
 * 归并排序
 * @author 选自《数据结构与算法分析 Java语言描述》 Mark Allen Weiss
 *
 */
public class MergeSort {
 /**
  * MergeSort Algorithm
  * @param <AnyType>
  * @param a an array of Comparable items
  */
    @SuppressWarnings({ “unchecked” })
 private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] a){
     AnyType[] tempArray = (AnyType[])new Comparable[a.length];
     mergeSort(a,tempArray,0,a.length-1);
    }
    /**
     * Internal method that makes recursive calls
     * @param <AnyType>
     * @param a an array of Comparable items
     * @param tempArray an array to place the merged result
     * @param left the left-most index of the subarray
     * @param right the right-most index of the subarray
     */
    private static <AnyType extends Comparable<? super AnyType>> void mergeSort(AnyType[] a,AnyType[] tempArray,int left,int right){
     if(left < right){
      int center = ( left + right ) / 2;
      mergeSort(a,tempArray,left,center);
      mergeSort(a,tempArray,center+1,right);
      merge(a,tempArray,left,center+1,right);
     }
    }
    /**
     * Internal method that merges two sorted  halves of a subarray
     * @param <AnyType>
     * @param a an array of Comparable items
     * @param tempArray an array to place the merged result
     * @param leftPos  the left-most index of the subarray
     * @param rightPos the index of start of the second harf
     * @param rightEnd right the right-most index of the subarray
     */
    private static <AnyType extends Comparable<? super AnyType>> void merge(AnyType[] a,AnyType[] tempArray,int leftPos,int rightPos,int rightEnd){
     int leftEnd = rightPos -1;
     int tempPos = leftPos;
     int numElements = rightEnd – leftPos + 1;
     //Main loop
     while(leftPos <= leftEnd && rightPos <= rightEnd){
      if(a[leftPos].compareTo(a[rightPos]) <=0 ){
       tempArray[tempPos++] = a[leftPos++];
      }else{
       tempArray[tempPos++] = a[rightPos++];
      }
     }
     while(leftPos <= leftEnd){
      tempArray[tempPos++] = a[leftPos++];
     }
     while(rightPos <= rightEnd){
      tempArray[tempPos++] = a[rightPos++];
     }
     //Copy tempArray back
     for(int i = 0;i<numElements;i++,rightEnd–){
      a[rightEnd] = tempArray[rightEnd];
     }
    }
 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
      Integer intArray [] = {13,192,32,24,24,53};
      mergeSort(intArray);
      for(int i: intArray){
       System.out.print(i+”/t”);
      }
 }

}

点赞