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”);
}
}
}