47. 归并排序
题目描述
给定一个整数数组,将其按升序排列。
解法思路
归并排序是「分而治之」思想的典型应用。核心在于两步:
- 分:递归地将数组切分为两半,直到长度为 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;
// 划分区间
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 k = left; k <= right; k++) {
nums[k] = tmp[k - left];
}
}
vector<int> sortArray(vector<int>& nums) {
tmp.resize(nums.size());
(nums, , nums.() - );
nums;
}
};




