操作过程与快速排序的预处理相似。需要三个指针,指针p0指向数组中已排好序的0前缀的后一个数,指针p2指向数组中已排好序的2后缀的前一个数,指针curr指向当前正在访问的数。
1.当curr指向0时,curr与p0指向的数互换,并都向右移
2.当curr指向2时,curr与p2指向的数互换,p2左移,注意此时curr不可右移,因为它可能指向0.
3.当curr指向1时,右移
java代码:
class Solution {
public void sortColors(int[] nums) {
int p0 = 0, curr = 0;
int p2 = nums.length - 1;
int temp;
while (curr <= p2) {
if (nums[curr] == 0) {
temp = nums[p0];
nums[p0++] = nums[curr];
nums[curr++] = temp;
}
else if (nums[curr] == 2) {
temp = nums[curr];
nums[curr] = nums[p2];
nums[p2--] = temp;
}
else curr++;
}
}
}
python3:
class Solution:
def sortColors(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
p0, p2 = 0,len(nums)-1
curr = 0
while(curr<=p2):
if(nums[curr]==0):
nums[curr],nums[p0] = nums[p0],nums[curr]
curr+=1
p0+=1
elif(nums[curr]==2):
nums[curr],nums[p2] = nums[p2],nums[curr]
p2-=1
else:
curr+=1