分析:题目说了一大堆,就是让对一个数组排序,数组中的元素只有0、1、2,并且要求只能遍历一遍数组,常数空间复杂度。借助于快速排序的partition思想,以1为枢纽元对数组进行划分,使0在数组的左边,2在数组的右边,1在数组的中间。通过此题,我发现自己对于快排思想理解得还不够透彻,对于快排的各种写法,尚没有熟练掌握。代码如下:
class Solution {
public:
void sortColors(int A[], int n) {
//zeroEnd是放0那部分的尾部索引,<span style="font-family: Arial, Helvetica, sans-serif;">twoBegin</span><span style="font-family: Arial, Helvetica, sans-serif;">是放2那部分的首部索引</span>
//碰到0放到zeroEnd+1处,碰到2放到twoEnd-1处,碰到1指针后移
int zeroEnd = -1, twoBegin = n, i = 0;
while(i < twoBegin)
{
if(A[i] == 0 && i != ++zeroEnd)
swap(A[zeroEnd], A[i]);
else if(A[i] == 2 && i != --twoBegin)
swap(A[twoBegin], A[i]);
else
i++;
}
}
};