问题:现有红,白,蓝三个不同颜色的小球,乱序排列在一起,请重新排列这些小球,使得红白蓝三色的同颜色的球在一起。
问题转化为:给定数组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); } }