题目:

一个数组包含0,1,2,对他们进行排序

思路1: two-pass

大家都能想到的,对0 1 2进行计数,然后重新调整数组,共遍历两次

void sortColors(vector<int>& nums) { //two-pass
	int red = 0, white = 0, blue = 0;
	for_each(nums.begin(), nums.end(), [&](int &n) {
		switch (n)
		{
		case 0:++red; 
		case 1:++white; 
		case 2:++blue; break;
		};
	});
	auto it = nums.begin();
	for (; it < nums.begin() + red; ++it)
		*it = 0;
	for (; it < nums.begin() + white; ++it)
		*it = 1;
	for (; it < nums.begin() + blue; ++it)
		*it = 2;
}

思路2:one-pass

设置参数beg,end和i。
[0,beg)均是0,[beg,i)均是1,(end,sz)均是2。

使i从0遍历至end

  • 若nums[i]==0, 与beg位置互换,然后i和beg进1
  • 若nums[i]==1,i进1
  • 若nums[i]==2,与end位置互换,此时end减1但是i不变,因为这个换过来的值是未知的,需要重新判定
void sortColors(vector<int>& nums) {
	int sz = nums.size();
	auto beg = 0, end = sz - 1, i = 0;
	
	while (i <= end) {
		if (nums[i] == 0)
			swap(nums[i++], nums[beg++]);
		else if (nums[i] == 2)
			swap(nums[i], nums[end--]);
		else
			++i;
	}
}