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 __MergeSort(T arr[], int l,int r)
{
if (l == r)
return;
int mid = l + (r - l) / 2;
__MergeSort(arr, l, mid);
__MergeSort(arr, mid + 1, r);
__Merge(arr, l, mid, r);
}
//归并排序
template<typename T>
void MergeSort(T arr[], int n)
{
__MergeSort(arr, 0,n-1);
}
改进:
1、在区间范围较小时,元素有序的概率较大,改用插入排序。
2、如果两段区间满足前一段末尾小于等于后一段开头,则已经有序,不需要进行__Merge。
//插入排序
template<typename T>
void InsertionSort(T arr[], int l,int r)
{
for (int i = l+1; i <= r; i++)
{
//写法3
T temp = arr[i];
int j = i;//保存元素temp应该插入的位置
for (; j > l && arr[j - 1] > temp; j--)
{
arr[j] = arr[j - 1];
}
arr[j] = temp;
}
}
template<typename T>
void __MergeSort(T arr[], int l,int r)
{
if (r - l <= 15)
{
InsertionSort(arr, l, r);
return;
}
int mid = l + (r - l) / 2;
__MergeSort(arr, l, mid);
__MergeSort(arr, mid + 1, r);
if(arr[mid]>arr[mid+1])
__Merge(arr, l, mid, r);
}