// 交换函数
public void swap(int[] A, int x, int y){
int temp = A[x];
A[x] = A[y];
A[y] = temp;
}
public void sortColors(int[] A) {
int i=0,j=A.length-1,k=0;
while(i<j && k<j){
// 顺序找到第一个不为0的元素
// 逆序找到第一个不为2的元素
while(i<j && A[i]==0) ++i;
while(i<j && A[j]==2) --j;
// 如果A[i]==A[j]==1时
if(A[i]==A[j]){
// 如果为1时,k开始搜索下一个非1的数,用于交换
if(k<i) k=i;
while(A[k]==1 && k<j) ++k;
// 当A[k]为0时与i交换;为2时与j交换;保证k为1;
if(A[k]==0) swap(A,i++,k);
else swap(A,j--,k);
}
// 如果A[i],A[j]不都为1;则有3种情况
// case1:1,0 case2:2,0 case3:2,1
// 求和case1:1 case2:2 case3:3
// 刚好可以根据和的大小来判断属于情况,避免不必要的if
// 先交换
// 如果case1:那么i排好位置 ++i
// 如果case2:那么i,j都排好++i,--j;
// 如果case3:那么j排好位置--j;
else{
int tag = A[i]+A[j];
swap(A,i,j);
switch(tag){
case 1:++i;break;
case 2:++i;--j;break;
case 3:--j;break;
}
}
}
}