leetcode 原题链接
给你一个整数数组 nums,请你将该数组升序排列。
示例 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 <= 50000
-50000 <= nums[i] <= 50000
class Solution {
void merge(vector<int> &nums, int l, int mid, int r)
{
//拷贝左半
int length = mid-l;
int arr[length];
int t=0;
for(int i=l;i<mid;i++)
{
arr[t++]=nums[i];
}
//归并
int i=0, j=mid;
while(i<length && j<r)
{
nums[l++]=arr[i]<nums[j]?arr[i++]:nums[j++];
}
while(i<length)
{
nums[l++]=arr[i++];
}
}
void merge_sort(vector<int>&nums, int l, int r)
{
if(r-l<2) return; //0个或1个元素自然有序
int mid = (l+r)>>1;
merge_sort(nums, l, mid);
merge_sort(nums, mid, r);
merge(nums, l, mid, r);
}
void quick_sort(vector<int> &nums, int l, int r)
{
if(r-l<2) return; //0个或1个元素自然有序
int beg = l, end = r;
//随机选择轴点
swap(nums[l], nums[l+rand()%(r-l)]);
int pivot = nums[l];
//轴点归位
while(l<r)
{
while(l<r && nums[--r]>pivot);
nums[l]=nums[r];
while(l<r && nums[++l]<pivot);
nums[r]=nums[l];
}
nums[l]=pivot;
//此时轴点已就绪,对轴点左右两部分进行排序
quick_sort(nums, beg, l);
quick_sort(nums, l+1, end);
}
public:
vector<int> sortArray(vector<int>& nums) {
quick_sort(nums, 0, nums.size());
return nums;
}
};