




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.问题描述: 我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。2.问题分析:这个问题我们可以将这个问题视为一个数组排序问题,这个数组分为前部,中部和后部三个部分,每一个元素(红白蓝分别对应0、1、2)必属于其中之一。由于红、白、蓝三色小球数量并不一定相同,所以这个三个区域不一定是等分的,也就是说如果我们将整个区域放在0,1的区域里,由于三色小球之间数量的比不同(此处假设1:2:2),可能前部为0,0.2),中部为0.2,0.6),后部为0.6,1。我们的思路如下:将前部和后部各排在数组的前边和后边,中部自然就排好了。具体的:设置两个标志位begin和end分别指向这个数组的开始和末尾,然后用一个标志位current从头开始进行遍历:1)若遍历到的位置为0,则说明它一定属于前部,于是就和begin位置进行交换,然后current向前进,begin也向前进(表示前边的已经都排好了)。2)若遍历到的位置为1,则说明它一定属于中部,根据总思路,中部的我们都不动,然后current向前进。3)若遍历到的位置为2,则说明它一定属于后部,于是就和end位置进行交换,由于交换完毕后current指向的可能是属于前部的,若此时current前进则会导致该位置不能被交换到前部,所以此时current不前进。而同1),end向后退1。/author:何佳#include using namespace std;void Swap(int* n1, int* n2)int temp;temp = *n1;*n1 = *n2;*n2 = temp;void Print(int* num, int len)for(int i=0; ilen; +i)cout numi ;cout endl;/0,1,2,1,1,2,0,2,1,0,2,1,0,2,0,1,2,0void Work(int* num, int begin, int end)int cur = begin;while(numcur = 0)begin+;cur = begin;while(numcur != 2)cur+;while(cur != end)if(numcur = 2 )Swap(&numcur, &numend);end-;if(numcur != numbegin & numcur != 2)Swap(&numbegin, &numcur);begin+;while(numcur = numbegin)cur+;if(numend != 2)Swap(&numcur, &numbegin);int main()int num = 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 using namespace std;const int N = 15;int flagN;int preN;int split1;int split2;int blue_red;int white_red;int counts = 0;/输出结果void Print()for(int i=0; iN; +i)cout flagi;cout endl;void Swap(int& x, int& y)int temp = x;x = y;y = temp;counts+;void Work()for(int i=0; i= split2)Swap(flagi, flagblue_red);blue_red = preblue_red;elseSwap(flagi, flagwhite_red);white_red = prewhite_red;int b= N - 1;for(int i=split1; isplit2; +i)if(flagi != 1)while(flagb = 2) b-;Swap(flagi, flagb);b-;/初始化void Init()int red_num = 0;int white_num = 0;int preI = -1;for(int i=0; iN; +i)flagi = rand() % 3;if(flagi = 0)red_num+;prei = preI;preI = i;elseif(flagi = 1)white_num+;/将国旗分成3中颜色区域/0split1-1(红), splite1split2-1(白), split2N-1(蓝)split1 = red_num;split2 = red_num + white_num;blue_red = preI;int i = split2 - 1;while(flagi !
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大学生寒假社会实践报告格式
- 大学生会计出纳实习报告
- 小儿歌课件教学课件
- 乡镇卫生保洁承包协议书
- 土地厂房果园出售合同范本
- 个人如何签在线合同协议
- 专业市场入驻协议书范本
- 饮料配送劳务用工合同范本
- 不轻易犯规免责合同范本
- 农家放养鸡出售合同范本
- 2025年佛山危险品资格证模拟考试题
- 居家护理服务标准化操作手册
- 2025年山西省中考生物试卷真题(含答案解析)
- 省级质控中心管理制度
- 2025至2030中国安保服务市场现状动态与前景方向分析报告
- 2024年空中乘务专业人才培养方案调研报告
- 医院信息安全管理制度
- 林科院面试题库及答案
- 催收公司成本管理制度
- T/CSIQ 8014.1-2018组串式光伏逆变器技术规范第1部分:总则
- 固体废物的处理与处置-固体废物的最终处置技术
评论
0/150
提交评论