描述
现在有一个包含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;
}
}