归并总结:
归并排序 时间复杂度O(nlogn) 空间复杂度O(n)
注意:
- 递归结束条件
- 和快排不一样,先递归左边,再递归右边,然后处理本级进行合并
- 记住四个 int 最后要将 data 数组内容复制到 arr
void mergesort(vector<int>& arr, vector<int>& data , int left, int right)
{
if(left >= right)
return;
int len = right - left;
// 由于这是从left开始加的,所以上面的长度并未加1
int mid = left + len/2;
int start1 = left;
int start2 = mid+1;
mergesort(arr, data, left, mid); //递归左边
mergesort(arr, data, mid+1, right); // 递归右边
int index = left;
while(start1 <= mid && start2 <= right)
{
data[index++] = arr[start1] < arr[start2] ? arr[start1++]:arr[start2++];
}
while(start1 <= mid)
{
data[index++] = arr[start1++];
}
while(start2 <= right)
{
data[index++] = arr[start2++];
}
for(int i = left; i <= right; i++)
{
arr[i] = data[i];
}
}