给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
分析:因为只有三个元素,所以可以暴力解决,遍历一遍,把0,1,2标记出现的次数,再次遍历赋值回去。
第二种,用三路快排算法,一次遍历就行。
暴力解决:
class Solution {
public:
void sortColors(vector<int>& nums) {
int a[3]={0};
for(int i=0;i<nums.size();i++)
{
assert(nums[i]>=0&&nums[i]<=2);
a[nums[i]]++;
}
int index=0;
for(int i=0;i<a[0];i++)
nums[index++]=0;
for(int i=0;i<a[1];i++)
nums[index++]=1;
for(int i=0;i<a[2];i++)
nums[index++]=2;
}
};
三路快排:
class Solution {
public:
void sortColors(vector<int>& nums) {
int start=-1;//[0...start]都为零
int end=nums.size();//[end...n-1]都为2
for(int i=0;i<end;)
{
if(nums[i]==1)
i++;
else if(nums[i]==2)
swap(nums[--end],nums[i]);
else{
assert(nums[i]==0);
swap(nums[++start],nums[i++]);
}
}
}
};