荷兰国旗算法

问题:现有红,白,蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。

问题转化为:给定数组A[0...N-1],元素只能取0,1,2三个值,设计算法,使得数组排列成00..0011...1122...222的形式。

借鉴快速排序中partition的过程。定义三个指针:begin=0,current=0,end=N-1;

A[cur] == 2,则A[cur]与A[end]交换,end--,cur不变

A[cur]==1,则cur++,begin不变,end不变

A[cur]==0,则:若begin==cur,则being++,cur++;若begin!=cur,则A[cur]与A[begin]交换,begin++,cur不变


代码实现如下;

public static void main(String[] args) {
   int[] array = new int[13];
   array[0] = 1;
   array[1] = 2;
   array[2] = -8;
   array[3] = 3;
   array[4] = 0;
   array[5] = 0;
   array[6] = -5;
   array[7] = 3;
   array[8] = 2;
   array[9] = -4;
   array[10] = 2 ;
   array[11] = -7;
   array[12] = 1;
   netherlandsFlag(array);
}

public static void netherlandsFlag(int[] array){
    int i = 0;
    int cur = 0;
    int j = array.length - 1;
    int temp;
    while(cur < j){
        if(array[cur] == 0){
            cur++;
        }else if (array[cur] > 0){
            temp = array[j];
            array[j] =  array[cur];
            array[cur] = temp;
            j--;
        } else {
            temp = array[i];
            array[i] = array[cur];
            array[cur] = temp;
            i++;
            cur++;
        }
    }
    for(int k : array){
        System.out.println(k);
    }
}

猜你喜欢

转载自blog.csdn.net/junglerofchina/article/details/79462853