三色球排序的问题,相同的球放到一起,让你按顺序输出红白蓝三种颜色的球,可以用012来表示,要求只能扫描一次数组



    问题描述:
我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。如下图所示:

   

    这个问题,类似快排中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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值