问题描述:
我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。如下图所示:
这个问题,类似快排中partition过程。不过,要用三个指针,一前begin,一中current,一后end,俩俩交换。
初始化:begin = current = 0; end = n-1;然后使begin指向开头处第一个不为0的位置,end指向后面第一个不为2的位置。
即:
while (arr[begin] == 0)
begin++;
current = begin + 1;
while (arr[end] == 2)
end--;
初始化好之后,进行下面操作。
1、current遍历,整个数组序列,arr[current] == 1,则current++,
2、arr[current] == 0,则与arr[begin]交换,而后current++,begin++,
3、arr[current] == 2,则与arr[end]交换,而后,current不动,end--。(之所以current不动,是因为交换后,arr[current]可能为0,此时要和arr[begin]互换的)
代码主体:
while( current<=end )
{
if( array[current] ==0 )
{
swap(array[current],array[begin]);
current++;
begin++;
}
else if( array[current] == 1 )
{
current++;
}
else //When array[current] =2
{
swap(array[current],array[end]);
end--;
}
}//end while