归并排序法
template <typename T>
//将arr[l...mid]和arr[mid+1...r]两部分合并
void __merge(T arr[],int l,int mid,int r){
T aux[r-l+1];
for(int i=l;i<+r;i++)
aux[i-l]=arr[i];//aux[]索引是从0开始,arr[]索引是从l开始
int i=l,j=mid+1;
for(int k=l;k<=r;k++){
if(i>mid){
arr[k]=aux[j-l];
j++;
}
else if(j>r){
arr[k]=aux[i-l];
i++;
}//先保证不越界
else if(aux[i-l]<aux[j-l]){
arr[k]=aux[i-l];
i++;
}
if(aux[j-l]<aux[i-l]){
arr[k]=aux[j-l];
j++;
}
}
}
//递归使用归并排序,对arr[l...r]的范围进行排序
void __mergeSort(T arr[],int l,int r){
if(l>=r)
return;
int mid = (l+r)/2;//注意这里有一定危险,如果l和r是两个非常大的数,有可能超过int范围
__mergeSort(arr,l,mid);
__mergeSort(arr,mid+1,r);
__merge(arr,l,mid,r);
}
void mergeSort(T arr[],int n){
__mergeSort(arr,0,n-1);//边界
}