一 实现思路
1 思维层面
1 关键是要 先想清楚需要维护哪些区间,以及每个区间的性质
2 把数组想象成 已处理区域 和 待处理区域
2 参考实现
二 代码实现
1 方法1: 三路快排,具体实现略(可见leetCode912), 时间复杂度O(nlogn)
2 方法2: 三路快排partiton 时间复杂度: O(n); 空间复杂度: O(1)
- 方法1没有利用到 "元素成员值只有 1/2/3"的性质,
- 通过利用这个性质,可以通过只实现三路快排的partition, 来简化时间复杂度
function sortColors(nums: number[]): void {
// [0, p0]都等于0;[p0+1, cur)都等于1;[p2, len-1]都等于2
// [cur, p2) 是 当前待处理的数
let p0 = -1, p2 = nums.length, cur = 0;
while (cur < p2) {
let x = nums[cur];
if (x === 0) swap(nums, ++p0, cur++);
if (x === 1) cur++;
if (x === 2) swap(nums, --p2, cur);
}
}
function swap(arr, i, j) {
[arr[i], arr[j]] = [arr[j], arr[i]];
}