三路快排
设置三个指针
i为工作指针,负责for循环遍历数组zero指示可以插入0的位置two指示可以插入2的位置
一开始将zero放在最左端,因为0要放在左边,将two放在最右端,因为2要放在右边。0和2都移动到位了,剩下的1自然在中间了
public void sortColors(int[] nums) {
int zero = 0, two = nums.length - 1;
for (int i = 0; i <= two; i++) {
while (nums[i] == 2 && i <= two) {
swap(nums, i, two);
two--;
}
if (nums[i] == 0) {
swap(nums, i, zero);
zero++;
}
}
}
void swap(int[] nums, int idx1, int idx2) {
int temp = nums[idx1];
nums[idx1] = nums[idx2];
nums[idx2] = temp;
}
注意for (int i = 0; i <= two; i++)中i <= two而不能i < two,因为将左边的2换到右边之后,two指针向左移后,下一个可能会指向0,i < two使i指针不能移动到0
注意while (nums[i] == 2 && i <= two)的原因是如果两个2发生交换,while循环就会继续下去直到把2换到右边去,而if (nums[i] == 0)不需要while是因为0本来就应该呆在左边
将移动0放在移动2的后面的原因是,交换2后可能会带来一个0