三色排序法 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+" ");
        }
    }
}
 

 

posted @ 2019-06-21 16:01  allenbackpacker  阅读(613)  评论(0编辑  收藏  举报