题目要求:
给你一个整数数组 nums
,请你将该数组升序排列。
你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n))
,并且空间复杂度尽可能小。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 5 * 10^4
-5 * 104 <= nums[i] <= 5 * 10^4
归并排序 O(NLogN):
归并排序的思路就是将一个数组分成左右两个数组,将左右两个数组分别排序好之后,将这两个有序数组再次进行排序即可。
cpp
class Solution {
vector<int> tmp; // 辅助数组
void _sortArray(vector<int>& nums, int sta, int end) {
if (sta == end)
return;
// 1、选择中间点划分数组
int mid = sta + (end - sta) / 2;
// 2、排序左右区间数组
_sortArray(nums, sta, mid);
_sortArray(nums, mid + 1, end);
// 3、排序的核心过程
int i = sta, j = mid+1, z = 0;
while (i <= mid && j <= end) {
if (nums[i] < nums[j])
tmp[z++] = nums[i++];
else
tmp[z++] = nums[j++];
}
while (i <= mid)
tmp[z++] = nums[i++];
while (j <= end)
tmp[z++] = nums[j++];
// 4、把排序好的结果复制到数组中
for (int i = sta; i <= end; i++)
nums[i] = tmp[i - sta];
}
public:
vector<int> sortArray(vector<int>& nums) {
tmp.resize(nums.size());
_sortArray(nums, 0, nums.size() - 1);
return nums;
}
};