题意: 有1数组为 02210210201012, 我们要把他排序成000011112222这样
要求不能用STL排序函数,空间复杂度为O(1)
思路: 交换法
设定左右两个指针
每次把 左边的非0 和 右边的0 进行交换, 换完后继续找左边的非0和右边的0
知道左右两个指针相遇,那么0都被换到最左边了。
接着再同样处理1(不过要注意,此时不要牵扯到0,因为0已经排好序了)
这样子的时间复杂度为O(n),空间为O(1)
class Solution {
public:
void sortColors(vector<int>& nums) {
int i,n;
n = nums.size();
int l=0,r=n-1,t;
while(l<r){
while(l < n && nums[l] == 0) l++; //先找到左边非0的位置
while(r >= 0 && nums[r] != 0) r--; //找到右边0的位置
if(l > r)
break;
t = nums[l]; //交换
nums[l] = nums[r];
nums[r] = t;
l++;r--;
}
l = 0,r=n-1;
while(l<r){
while(l < n && nums[l] != 2) l++; //先找到左边为2的位置
while(r >= 0 && nums[r] != 1 || nums[r] == 0) r--; //找到右边为1的位置
if(l > r)
break;
t = nums[l]; //交换
nums[l] = nums[r];
nums[r] = t;
l++;r--;
}
}
};