题目讲解
912. 排序数组
算法讲解
我们这里使用三指针,将数组分成三块:<key 和 == key 和 >key,如果当前指针指向的数字<key,我们就swap(nums[++left]), nums[i++] 。如果当前的数字==key ,就让i++。如果当前的数字>key,就让swap(nums[–right], nums[i])。然后继续对<key的区间进行排序,>key的区间进行排序
class Solution {
public:
void my_qsort(vector<int>& nums, int l, int r)
{
if(l >= r)return;
int i = l; int left = l-1; int right = r+1;
int key = nums[rand() % (r - l + 1) + l];
while(i < right)
{
if(nums[i] < key)swap(nums[++left], nums[i++]);
else if(nums[i] == key)i++;
else swap(nums[--right], nums[i]);
}
//一次的分治已经结束 完成下一次的排序
my_qsort(nums, l ,left);
my_qsort(nums, right, r);
}
vector<int> sortArray(vector<int>& nums) {
//快排的核心: 数组分三块
srand(time(NULL));
my_qsort(nums, 0, nums.size() - 1);
return nums;
}
};