//合并排序
template<typename T>
void Merge(T* a, int l, int m, int r)
{
int n1 = m - l +1;
int n2 = r - m;
T* L = new T[n1];
T* R = new T[n2];
//初始化L、R数组
for(int i = 0; i < n1; i++)
L[i] = a[l + i];
for(int i = 0; i < n2; i++)
R[i] = a[m + i + 1];
int i = 0;
int j = 0;
int k = l;
while(i < n1 && j < n2)
{
if(L[i] < R[j])
{
a[k++] = L[i++];
} else {
a[k++] = R[j++];
}
}
while(j < n2) a[k++] = R[j++];
while(i < n1) a[k++] = L[i++];
}
template<typename T>
void Merge_Sort_dispatch(T* a, int l, int r) //对[l,r]区间进行排序
{
if(l < r)
{
int m = (l + r) / 2;
Merge_Sort_dispatch (a,l,m);
Merge_Sort_dispatch (a,m+1,r);
Merge (a,l,m,r);
}
}
template<typename T>
void Merge_Sort(T* a,int n)
{
Merge_Sort_dispatch(a,0,n-1);
}