47. 归并排序
题目描述
给定一个整数数组 nums,将其升序排列。
解法思路
归并排序是「分治策略」的典型应用。整个过程可以拆解为两个阶段:
- 分:递归地将数组切分成最小单元(长度为 1),直到无法再分。
- 治:将两个有序的子数组合并成一个更大的有序数组,直至合并回完整序列。
这种自底向上的合并过程保证了时间复杂度稳定在 O(nlogn),且空间复杂度为 O(n)。
C++ 代码实现
class Solution {
public:
vector<int> tmp; // 辅助数组,用于存放合并后的结果
void mergesort(vector<int>& nums, int left, int right) {
if (left == right) return; // 递归终止条件:区间只有一个元素
// 选取中点,将区间 [left, right] 一分为二
int mid = (right - left) / 2 + left;
// 递归排序左右两部分
mergesort(nums, left, mid);
mergesort(nums, mid + 1, right);
// 合并两个有序区间
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++];
// 将临时数组的数据拷贝回原数组对应位置
for (int i = left; i <= right; i++) {
nums[i] = tmp[i - left];
}
}
{
tmp.(nums.());
(nums, , nums.() - );
nums;
}
};




