题目:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-colors
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution {
public:
void swap(vector<int>& nums,int a,int b){
int c=nums[a];
nums[a]=nums[b];
nums[b]=c;
}
void sortColors(vector<int>& nums) {
int zero,two;
zero=0,two=nums.size();
int i=0;
while(i<two){
if(nums[i]==0){
swap(nums,zero,i);
++zero;
++i;
}
else if(nums[i]==1){
++i;
}
else if(nums[i]==2){
--two;
swap(nums,two,i);
}
/*
++zero和++i要同时进行是因为,i之前的值只可能为0,1(2已经被换到后面two指向的地方去了)
当zero!=i是zero指向的一定是1,i如果指向的是0,需要发生交换,交换过来的值为1,交换后i处的
值不需要再判定一次,i直接自增就行了。
当zero==i是,nums[zero/i]=0时,他和自己交换,位置不变,zero的指向为0,不符合zero指针
的定义必须后移。如果为nums[zero/i]=1时,那么zero已经指向1了,不要后移了.
而two交换后减一而i不变是因为,交换后,i指向可能为0或者1还需要再判断一次。
*/
else return;
}
}
};