题目讲解
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;}
};