class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param colors int整型vector 
     * @return int整型vector
     */
    vector<int> sortColor(vector<int>& colors) {
        int n = colors.size();
	  // 只聚焦于0和2,当把0和2都处理完后,1自然也处理好了
        int p0 = 0, p2 = n-1;
	  // 从数组头元素开始遍历,直到与p2相遇后,因为p2索引后的元素应该排好了2
        for(int i=0; i<=p2; ++i){
		  // 如果当前遇到了2,且索引符合置换条件,那么就交换
		  // 因为之前的p2所指位置可能本身也是2,所以是while循环判断
            while(colors[i]==2 && i < p2){
                swap(colors[i], colors[p2--]);
            }
		  // 如果遇到了0 (或者说原本是2,但经过上面的while代码块交换后,换回来了一个0),那么与p0索引交换
            if(colors[i]==0)    swap(colors[i],colors[p0++]);
        }
        return colors;
    }
};