47. 归并排序
题目描述
给定一个整数数组 nums,请你将该数组升序排列。

解题思路
归并排序是典型的「分而治之」策略。它的核心逻辑非常直观:先把大问题拆成小问题,解决后再合并。
具体流程分为两步:
- 分:将数组不断二分,直到每个子数组长度为 1(此时天然有序)。
- 治:将两个有序的短数组合并成一个长的有序数组,递归向上合并直至完成整个数组的排序。
这种自底向上的合并过程保证了时间复杂度稳定在 O(n log n),且空间复杂度为 O(n)。
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;
}
};







