三色排序法 ThreeColorSort
小药药面试有个题是基于 三色排序法的。如下:
题1: 一个数组 int[] A = {2,3,0,-2,-6,23,0,4,4......n} 如何把里面所有的正数放在左侧,0 放在中间,负数放在右侧?
这个随笔是关于三色排序的:
加入给定一个数组仅包含 0 1 2, 比如 {0, 1, 0, 2, 1, 2, 2, 0, 0, 1, 1},(或者说有三个颜色的小球,红黄蓝),请排序,把所有的 0 放在最左边,1放在中间, 2放在右边。
Java 代码如下:
参考 算法练习:两指针之三色排序(https://blog.csdn.net/s634772208/article/details/46740191 )
package sort.algorithm;
public class XiaoYaoYaoInterview2
{
public static void main(String[] args)
{
int[] A = {2,0,1,0,2,1,0,0,1,1};
ThreeColorSort(A);
}
public static void ThreeColorSort(int[] A)
{
int p0 = 0;
int p1 = A.length -1;
int i = 1;
while(i <= p1)
{
//当前值为2,与尾指针p1指向的值相互交换,p1向前移动一位
//i、p0位置不变
if(A[i] == 2)
{
int nTemp = A[i];
A[i] = A[p1];
A[p1] = nTemp;
p1--;
}
//当前值为0,与首指针p0指向的值相互交换,p0向后移动一位
//i、p1位置不变
else if (A[i]==0 && i> p0) //这个条件很重要, i>p0 时才交换
{
int nTemp = A[i];
A[i] = A[p0];
A[p0] = nTemp;
p0++;
}
//i位置为 1,i 要向后移动一位,p0、p1位置不变。
else {
i++;
}
}
//打印数据以便查看正确与否
for (int a : A)
{
System.out.print(a+" ");
}
}
}
public class XiaoYaoYaoInterview2
{
public static void main(String[] args)
{
int[] A = {2,0,1,0,2,1,0,0,1,1};
ThreeColorSort(A);
}
public static void ThreeColorSort(int[] A)
{
int p0 = 0;
int p1 = A.length -1;
int i = 1;
while(i <= p1)
{
//当前值为2,与尾指针p1指向的值相互交换,p1向前移动一位
//i、p0位置不变
if(A[i] == 2)
{
int nTemp = A[i];
A[i] = A[p1];
A[p1] = nTemp;
p1--;
}
//当前值为0,与首指针p0指向的值相互交换,p0向后移动一位
//i、p1位置不变
else if (A[i]==0 && i> p0) //这个条件很重要, i>p0 时才交换
{
int nTemp = A[i];
A[i] = A[p0];
A[p0] = nTemp;
p0++;
}
//i位置为 1,i 要向后移动一位,p0、p1位置不变。
else {
i++;
}
}
//打印数据以便查看正确与否
for (int a : A)
{
System.out.print(a+" ");
}
}
}