将后面的值与前面小于它的值交换,类似于快速排序中的分区,但是下面的做法并不优雅,最直接的想法是counting sort,但是需要两次遍历。
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int i,j;
for(j=n-1,i=0;j>i;j--)
{
if(nums[j]==0)
{
while(nums[i]==0&&i<j)
{
i++;
}
swap(nums[i],nums[j]);
}
}
while(i<n&&nums[i]==0)
i++;
for(j=n-1;i<j;j--)
{
if(nums[j]==1)
{
while(nums[i]==1&&i<j)
{
i++;
}
swap(nums[i],nums[j]);
}
}
}
};
使用两个两个基准将数组分成三个区
class Solution {
public:
void sortColors(vector<int>& nums) {
int n=nums.size();
int i;
int l=0,r=n-1;
for(i=0;i<=r;)
{
if(nums[i]==0)
{
swap(nums[i],nums[l]);
l++;
i++;
}
else if(nums[i]==1)
{
i++;
}
else
{
swap(nums[i],nums[r]);
r--;
}
}
}
};