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

简介: 作者: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”,限定除了一个空格外单词间没有任何其他分隔符。
839 0
|
算法
【算法习作】已知有一个数字在某数组中出现次数超过一半,求这个数
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 要求O(n)时间复杂度。 利用“已经知道这个数字在整个数组中出现的比例超过50%”这个事实,采用计数法。
859 0
|
算法
【算法习作】中国象棋将帅问题
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/   在《编程之美》上的一道题,书上最后一种用结构体的方法我直接醉了,这个确实有点文字游戏的意思,不过其实面试中这反倒考验了被面试者的沟通和理解能力,说白了谁让你不问呢?你不问怎么知道就不能用呢?不要给自己下套。
778 0
|
13天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
3天前
|
算法 数据安全/隐私保护 异构计算
基于LSB最低有效位的音频水印嵌入提取算法FPGA实现,包含testbench和MATLAB对比
本项目展示了一种基于FPGA的音频水印算法,采用LSB(最低有效位)技术实现版权保护与数据追踪功能。使用Vivado2019.2和Matlab2022a开发,完整代码含中文注释及操作视频。算法通过修改音频采样点的最低有效位嵌入水印,人耳难以察觉变化。然而,面对滤波或压缩等攻击时,水印提取可能受影响。该项目运行效果无水印干扰,适合实时应用场景,核心逻辑简单高效,时间复杂度低。

热门文章

最新文章