描述
现在有一个包含n个物体的数组,其中物体颜色为颜色为红色、白色或蓝色,请对这个数组进行排序,让相同颜色的物体相邻,颜色的顺序为红色,白色,蓝色。
我们用0,1,2分别代表颜色红,白,蓝
注意:
本题要求你不能使用排序库函数
扩展:
一个非常直接的解法是两步的计数排序的算法
首先:遍历一遍数组,记录0,1,2的数量,然后重写这个数组,先将0写入,再将1写入,再将2写入
你能给出一个只用一步,并且能在常数级空间复杂度解决这个问题的算法吗?
解题思路:
public class Solution {
    public void sortColors(int[] A) {
        int p0 = 0,crr = 0, p2 = A.length-1;     //令p0指向1的右边界,p2指向2的左边界,也就是说[0,p0)属于1;(p2,A.length-1]属于2
        while(crr <= p2){     
            if(A[crr] == 0){    //如果是0放在数组前边
                swap(A,crr,p0);
                ++crr;
                ++p0;
            }else if(A[crr] == 2){   //如果是2放在数组后边
                swap(A,crr,p2);
                --p2;
            }else ++crr;    //剩下的为1自动放在中部
        }
    }
    
    public void swap(int[] A,int i,int j){
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
}









