小球荷兰国旗问题

荷兰vps  时间:2020-12-31  阅读:()

1 .问题描述

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

2.问题分析

这个问题我们可以将这个问题视为一个数组排序问题 这个数组分为前部 中部和后部三个部分每一个元素红白蓝分别对应0、 1 、 2必属于其中之一。 由于红、 白、蓝三色小球数量并不一定相同 所以这个三个区域不一定是等分的也就是说如果我们将整个区域放在[0, 1]的区域里 由于三色小球之间数量的比不同此处假设1 :2:2 可能前部为[0,0.2) 中部为[02,0 6)  后部为[06, 1] 。 我们的思路如下将前部和后部各排在数组的前边和后边 中部自然就排好了。具体的

设置两个标志位begin和end分别指向这个数组的开始和末尾 然后用一个标志位current从头开始进行遍历

1 若遍历到的位置为0 则说明它一定属于前部 于是就和begin位置进行交换然后current向前进 begin也向前进表示前边的已经都排好了 。

2若遍历到的位置为1  则说明它一定属于中部 根据总思路 中部的我们都不动然后current向前进。

3若遍历到的位置为2 则说明它一定属于后部 于是就和end位置进行交换 由于交换完毕后current指向的可能是属于前部的 若此时current前进则会导致该位置不能被交换到前部所以此时current不前进。而同1   end向后退1 。

//author:何佳

#include<iostream>usingnamespacestd;voidSwap(int*n1, int*n2) {inttemp;temp=*n1 ;

*n1=*n2;

*n2=temp;

}voidPrint(int*num, intlen)

{for(inti=0; i<len;++i)

{cout<<num[i]<<"";

}cout<<endl;

}

//0, 1,2, 1, 1,2,0,2, 1,0,2, 1,0,2,0, 1,2,0voidWork(int*num, intbegin, intend)

{intcur=begin;whi le(num[cur]==0)

{begin++;cur=begin;

}whi le(num[cur] !=2)

{cur++;

}while(cur!=end)

{if(num[cur]==2)

{

Swap(&num[cur] ,&num[end]) ;end--;

}if(num[cur] !=num[begin]&&num[cur] !=2) {Swap(&num[begin] ,&num[cur]) ;begin++;

}while(num[cur]==num[begin])

{cur++;

}

}if(num[end] !=2)

{

Swap(&num[cur] ,&num[begin]) ;

}

}intmain()

{intnum[]={0, 1,2, 1, 1,2,0,2, 1,0,2,0, 1,2,0, 1,2,0, 1, 1, 1,2, 1,2, 1, 1} ; int len=sizeof(num)/sizeof(int) ;

Print(num, len) ;

Work(num,0, len-1) ;

Print(num, len) ;

}

/*左飞C++数据结构与经典问题求解*/

/*荷兰国旗问题*/

/*众所周知荷兰国旗由红色、 白色和蓝色3中颜色组成现在假设有很多这3中颜色的线被存放在一个数字里 要求每次操作仅能进行一次交换 待对数字进行一遍扫描后 3中颜色自然分开颜色顺序应为红、 白、蓝。 另外 要求在O(n)的复杂度下使移动次数最小。

*/

#include<iostream>usingnamespacestd;constintN=15;intflag[N];intpre[N];intspl it1;intspl it2;intblue_red;intwhite_red;intcounts=0;

//输出结果voidPrint()

{for(inti=0;i<N;++i)

{cout<<flag[ i] ;

}cout<<endl;

}voidSwap(int&x, int&y)

{inttemp=x;x=y;y=temp;counts++;

}voidWork()

{for(inti=0;i<spl it1;++i)

{if(flag[i] !=0)

{if(blue_red>=spl it2)

{

Swap(flag[ i] ,flag[blue_red] ) ;blue_red=pre[blue_red];}else

{

Swap(flag[ i] ,flag[white_red] );white_red=pre[white_red];}

}

}intb=N-1;for(inti=spl it1;i<spl it2;++i)

{if(flag[i] !=1)

{whi le(flag[b]==2)b--;

Swap(flag[ i] ,flag[b]) ;b--;

}

}

}

//初始化voidInit( )

{intred_num=0;intwhite_num=0;intpreI=-1;for(inti=0;i<N;++i)

{flag[i ]=rand()%3;if(flag[i]==0)

{red_num++;pre[ i]=preI;preI=i;

}else if(flag[i]==1)

{white_num++;

}

}

//将国旗分成3中颜色区域

//0~spl it1-1(红),spl ite1~spl it2-1(白)  spl it2~N-1(蓝)spl it1=red_num;spl it2=red_num+white_num;blue_red=preI;inti=spl it2-1;whi le(flag[i] !=0) i--;//检查白色中有没有红色white_red=i;

}intmain()

{

Init();cout<<"原始 "<<endl ;

Print( ) ;

Work();cout<<"移动 "<<counts<<"次"<<endl;Print( ) ;return0;

}

Linode 18周年庆典活动 不断改进产品结构和体验

今天早上相比很多网友和一样收到来自Linode的庆祝18周年的邮件信息。和往年一样,他们会回顾在过去一年中的成绩,以及在未来准备改进的地方。虽然目前Linode商家没有提供以前JP1优化线路的机房,但是人家一直跟随自己的脚步在走,确实在云服务器市场上有自己的立足之地。我们看看过去一年中Linode的成就:第一、承诺投入 100,000 美元来帮助具有社会意识的非营利组织,促进有价值的革新。第二、发...

piayun(pia云)240元/季起云服务器,香港限时季付活动,cn2线路,4核4G15M

pia云怎么样?pia云是一家2018的开办的国人商家,原名叫哔哔云,目前整合到了魔方云平台上,商家主要销售VPS服务,采用KVM虚拟架构 ,机房有美国洛杉矶、中国香港和深圳地区,洛杉矶为crea机房,三网回程CN2 GIA,带20G防御。目前,Pia云优惠促销,年付全场8折起,香港超极速CN2季付活动,4核4G15M云服务器仅240元/季起,香港CN2、美国三网CN2深圳BGP优质云服务器超高性...

iON Cloud:新加坡cn2 gia vps/1核/2G内存/25G SSD/250G流量/10M带宽,$35/月

iON Cloud怎么样?iON Cloud升级了新加坡CN2 VPS的带宽和流量最低配的原先带宽5M现在升级为10M,流量也从原先的150G升级为250G。注意,流量也仅计算出站方向。iON Cloud是Krypt旗下的云服务器品牌,成立于2019年,是美国老牌机房(1998~)krypt旗下的VPS云服务器品牌,主打国外VPS云服务器业务,均采用KVM架构,整体性能配置较高,云服务器产品质量靠...

荷兰vps为你推荐
虚拟空间哪个好虚拟主机哪家的最好?重庆虚拟空间现在重庆那家主机空间最好?美国网站空间购买美国网站空间使用会不会麻烦呢,深圳网站空间菜鸟问:网站空间如何选择,与空间的基本知识?深圳网站空间求免费稳定空间网站?100m虚拟主机虚拟主机 100M 和200M 的区别?那个速度快?为什么?上海虚拟主机我想购买虚拟主机,选个品牌。大家给点意见。电信为主。当然肯定要支持多线。虚拟主机mysql怎么管理虚拟主机上的MYSQL?(高分回报)mysql虚拟主机如何建立支持PHP+MySQL的虚拟主机?美国免费虚拟主机哪有便宜的美国虚拟主机?246数据美国虚拟主机一年才40元http://246idc.com/host/
日本vps 淘宝二级域名 七牛优惠码 私服服务器 好看的留言 国内php空间 qq数据库 福建天翼加速 阿里云浏览器 howfile 绍兴电信 免费网页申请 江苏双线服务器 申请网站 北京主机托管 石家庄服务器 windows2008 美国达拉斯 rewrite规则 招聘瓦工 更多