三路快排的 partition,将小于枢轴 tar 的数放左边,大于枢轴的数放右边,且中间全是枢轴值。即有三个下标 l, cur, r,其中 [0, r) 的值小于 tar,[l, r] 的值等于 tar,(r, nums.size) 大于 tar。
可以这样理解代码:
如果 nums[cur] < tar,那么必然可以直接交换 nums[cur] 与 nums[l],且 ++l,且 ++cur
如果 nums[cur] > tar,那么必然可以直接交换 nums[cur] 与 nums[r],且 --r,但不能 ++cur,因为 nums[r] 的值与 tar 相比大小未知,由于是进行的 swap,所以直接不 ++cur 即可。
如果 nums[cur] == tar,直接 ++ cur 即可。
class Solution { public: void sortColors(vector<int>& nums) { int l = 0, r = nums.size() - 1, cur = 0; int tar = 1; while(cur <= r) { if(nums[cur] > tar) { swap(nums[r], nums[cur]); -- r; continue; } if(nums[cur] < tar){ swap(nums[l], nums[cur]); ++ l; } ++ cur; } } };