关于归并排序的介绍可以参考这边博客:归并排序算法(经典返回变量版)——C++_净无邪博客-CSDN博客。本文主要是对递归排序进行优化。
由于经典版本返回临时变量的归并排序效率比较低,需要多每次创建临时空间进行优化,使用一个固定内存空间,这样可以减少每次创建和销毁内存空间的时间消耗,由于这部分很费时间,所以优化效果是比较明显的。
优化版跟基本版的区别主要区别如下:
1.归并函数原来是入参两个数组,优化后入参为两个待排序数组合并在一起的起始和截止位置,如下所示:
void merge1(vector<int>& nums, int start, int end, vector<int>& tmpNums); // 优化后版本
vector<int> merge(vector<int>& nums1, vector<int>& nums2); // 优化前版本
由上面代码可知,优化后除了包含两个有序代码数组的起始和截止位置,还多了一个存储临时变量的数组
2.归并排序进行“分”的二分法操作时,递归顺序仍然和原来一样都是先递归遍历左边元素再遍历右边元素,等两边元素都有序后再调用合并函数将两个有序数组合并成一个数组存储在临时存储空间tmpNums中。
优化后递归函数
void Sorts::merge(vector<int>& nums, int start, int end, vector<int>& tmpNums)
{
if (start == end) //递归终止条件:如果起始下标等于结束下标,则终止递归
return; // 返回
int middle = (start + end) / 2; // 分治法,采用二分法,取中间下标开始左右递归,直到一个元素开始返回
merge(nums, start, middle, tmpNums); // 先递归左边部分,退出该层后向右递归,直到一个元素
print(tmpNums);
merge(nums, middle + 1, end, tmpNums); // 先左边再右边递归取有序数组
merge1(nums,