归并排序的一个核心的操作是将一个序列中前后两个相邻的子序列合并为一个有序序列。
/**
* a待合并两个区间[p..q] [q+1..r]
* @param a
* @param p
* @param q
* @param r
*/
public void merge(Object[] a, int p,int q,int r){
Object[] b = new Object[r-p+1];
int s = p;
int t = q+1;
int k = 0;
while(s<=q && t<=r){
if(strategy.compare(a[s], a[t]) <0){
b[k++] = a[s++];
}else{
b[k++] = a[t++];
}
}
while(s<=q){
b[k++] = a[s++];
}
while(t<=r){
b[k++] = a[t++];
}
for(int i=0; i<b.length; i++){
a[p+i] = b[i];
}
}
/**
* 归并排序
* @param r
* @param low
* @param high
*/
public void mergeSort(Object[] r,int low,int high) {
if(low < high){
mergeSort(r, low, (high+low)/2);
mergeSort(r, (high+low)/2+1, high);
merge(r, low, (high+low)/2,high);
}
}