上一篇讲到的归并排序算法,在待排序列基本有序或者完全有序的情况下进行测试,其时间性能比插入排序差很多,针对这种情况,对归并排序算法作出优化,先观察归并排序算法的代码:
template<typename T>
void __mergeSort(T arr[], int l, int r) //一定要注意我设定的是左闭右闭[l...r](r是最后一个元素)
{
//递归使用归并排序,对arr[l...r]进行归并
//先考虑递归最底层
if(l >= r)
{
return;
}
else
{
int mid = (l + r) / 2;
//对左半部分arr[l...mid]进行归并排序
__mergeSort(arr, l, mid);
//再对右半部分arr[mid + 1...r]进行归并排序
__mergeSort(arr, mid + 1, r);
//然后将排好序的左右两部分归并到一起
__merge(arr, l, mid, r);
}
}
可以看到,arr[l...mid]和arr[mid+1...r]分别完成归并排序后,程序不管这两部分组成的arr[l...r]是否有序就执行了__merge(arr, l, mid, r),若