47. 归并排序
题目链接
题目描述
给定一个整数数组 nums,将该数组升序排列。
题目示例
输入:[5,2,3,1]
输出:[1,2,3,5]
解题思路
归并排序是典型的分治算法,核心在于'分'与'治'。
分: 将数组不断二分,直到每个子数组长度为 1。此时单个元素天然有序。 治: 将两个有序的子数组合并成一个更大的有序数组。递归向上合并,最终得到完整有序数组。
C++ 算法代码
class Solution {
public:
vector<int> tmp;
void mergesort(vector<int>& nums, int left, int right) {
if (left == right) return;
// 1. 选择中间点划分区间
int mid = (right - left) / 2 + left;
// 2. 递归排序左右两部分
mergesort(nums, left, mid);
mergesort(nums, mid + 1, right);
// 3. 合并两个有序数组
int cur1 = left, cur2 = mid + 1, i = 0;
while (cur1 <= mid && cur2 <= right) {
tmp[i++] = nums[cur1] <= nums[cur2] ? nums[cur1++] : nums[cur2++];
}
while (cur1 <= mid) tmp[i++] = nums[cur1++];
while (cur2 <= right) tmp[i++] = nums[cur2++];
// 还原回原数组
( i = left; i <= right; i++) {
nums[i] = tmp[i - left];
}
}
{
tmp.(nums.());
(nums, , nums.() - );
nums;
}
};




