#include<iostream>
#include<vector>
using namespace std;
/*
随机选取一个数(x = rand() % len + startIndex)作为基准;
把比基准小的数交换到前面,比基准大的数交换到后面;
对左右区间递归重复。
时间复杂度nlogn,空间复杂度logn
*/
class Solution {
public:
void quickSort(vector<int>& nums,int left,int right) {
if (left >= right) return;
int x = rand() % (right - left + 1) + left;//(left,right]间随机数,随机设置分界值
swap(nums[left], nums[x]);//分界值作为最左值
int key = nums[left];//key保存分界值
int l = left, r = right;
while (l < r) {
//从后往前走,将比第一个小的移到前面
while (l < r && nums[r] >= key) --r;
if (l < r) {
nums[l] = nums[r];
}
//从前往后走,把比第一个大的移到后面
while (l < r && nums[l] <= key) ++l;
if (l < r) {
nums[r] = nums[l];
}
}//找到比分界值大、小的数并交换,循环后l==r,左边都比key小,右边大
nums[l] = key;//key值放到分界处
//递归
quickSort(nums, left, l - 1);
quickSort(nums, l + 1, right);
}
public:
vector<int> sortArray(vector<int>& nums) {
int n = nums.size();
quickSort(nums, 0, n - 1);
return nums;
}
};