template<typename T>
void __Merge(T arr[], int l,int mid, int r)
{
T* arr1 = new T[r - l + 1];
int k = 0, i = l, j = mid + 1;
for (; k < r - l + 1 && i<=mid &&j<=r; k++)
{
if (arr[i] >= arr[j])
arr1[k] = arr[j++];
else
arr1[k] = arr[i++];
}
while(i<=mid)
arr1[k++] = arr[i++];
while (j <= r)
arr1[k++] = arr[j++];
for (int m = 0; m < r - l + 1; m++)
{
arr[m + l] = arr1[m];
}
delete[] arr1;
}
//归并排序
template<typename T>
void MergeSortBU(T arr[], int n)
{
for (int d = 1; d <= n; d *= 2) {
//i+d<n确保最后一次合并有2个区间
for (int i = 0; i+d <n; i += 2*d)
{
//对[i,i+d-1]和[i+d,i+2d-1]区间进行合并
if(arr[i+d-1] > arr[i+d])
__Merge(arr, i, i + d - 1, std::min(i + 2*d - 1,n-1));
}
}
}
自底向上的归并排序。