问题描述:
我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。如下图所示:
这个问题,类似快排中partition过程。不过,要用三个指针,一前begin,一中current,一后end,俩俩交换。
1、current遍历,整个数组序列,current指1不动,
2、current指0,与begin交换,而后current++,begin++,
3、current指2,与end交换,而后,current不动,end--。
为什么,第三步,current指2,与end交换之后,current不动了列,对的,正如algorithm__所说:current之所以与begin交换后,current++、begin++,是因为此无后顾之忧。而current与end交换后,current不动,end--,是因有后顾之忧。
为什么啊,因为你想想啊,你最终的目的无非就是为了让0、1、2有序排列,试想,如果第三步,current与end交换之前,万一end之前指的是0,而current交换之后,current此刻指的是0了,此时,current能动么?不能动啊,指的是0,还得与begin交换列。
ok,说这么多,你可能不甚明了,直接引用下gnuhpc的图,就一目了然了:
从上面的分析知,可以写出代码,现在自己用java实现:
package com.qetch.base;
/**
* 一个数组中我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。
* 这个问题之所以叫荷兰国旗,
* 是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗
* 数组中元素为0,1,2,按0,1,2排序
* 0,1,2各代表一种颜色
*/
public class GraphYellow {
public static void main(String[] args) {
int [] a= {0,1,2,1,1,2,0,2,1,0};
paritionYellowArray(a);
for(int t:a){
System.out.print(t);
}
}
private static void swap(int[] a, int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
private static void paritionYellowArray(int[] a) {
int current=0;
int begin=0;
int end=a.length-1;
while(current<end){
if(a[current]==0){
swap(a,current,begin);
begin++;
current++;
}else if(a[current]==2){
swap(a,current,end);
end--;
}else{
current++;
}
}
}
}