【算法习作】荷兰国旗问题

简介: 作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.问题描述:    我们将乱序的红白蓝三色小球排列成有序的红白蓝三色的同颜色在一起的小球组。这个问题之所以叫荷兰国旗,是因为我们可以将红白蓝三色小球想象成条状物,有序排列后正好组成荷兰国旗。

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/

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。

3.解决代码:

 /*
* =====================================================================================
*
* Filename: Dutchflag.cpp
*
* Description:
*
* Version: 1.0
* Created: 02/25/2011 09:31:21 AM
* Revision: none
* Compiler: gcc
*
* Author: gnuhpc , warmbupt@gmail.com
*
* =====================================================================================
*/
#include <iostream>
#include <stdlib.h>
using namespace std;
#define N 10
void swap (int &var1, int &var2)
{
int temp = var1;
var1 = var2;
var2 = temp;
}
void shuffle(int *array)
{
int current = 0;
int end = N-1;
int begin = 0;
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--;
}
}
}
int main(int argc, char *argv[])
{
int a[N];
int i;
for( i=0 ; i<N; i++ )
{
a[i] = rand()%3;
cout << a[i] << " ";
}
cout << endl;
shuffle(a);
for( int i=0 ; i<N ; i++ )
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}

 

 

作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/


               作者:gnuhpc
               出处:http://www.cnblogs.com/gnuhpc/
               除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


分享到:

目录
相关文章
|
算法
【算法习作】字符串处理两例
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1.按词倒置一个句子 题目:例如”I am a student”,经处理后得到”student am a I”,限定除了一个空格外单词间没有任何其他分隔符。
828 0
|
算法
【算法习作】已知有一个数字在某数组中出现次数超过一半,求这个数
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 要求O(n)时间复杂度。 利用“已经知道这个数字在整个数组中出现的比例超过50%”这个事实,采用计数法。
853 0
|
算法
【算法习作】中国象棋将帅问题
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/   在《编程之美》上的一道题,书上最后一种用结构体的方法我直接醉了,这个确实有点文字游戏的意思,不过其实面试中这反倒考验了被面试者的沟通和理解能力,说白了谁让你不问呢?你不问怎么知道就不能用呢?不要给自己下套。
766 0
|
17天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
2天前
|
存储
基于遗传算法的智能天线最佳阵列因子计算matlab仿真
本课题探讨基于遗传算法优化智能天线阵列因子,以提升无线通信系统性能,包括信号质量、干扰抑制及定位精度。通过MATLAB2022a实现的核心程序,展示了遗传算法在寻找最优阵列因子上的应用,显著改善了天线接收功率。

热门文章

最新文章