问题描述:现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球、白球、蓝球。这个问题之所以叫做荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后正好组成荷兰国旗。

                     

                   

解题方法1:蛮力求解

解题方法2:为了讨论方便用数字0表示红色球,用数字1表示白色球,用数字2表示蓝色球,所以最后的排序就是0...1...2...

快速排序基于划分过程,选取主元间整个数组划分为两个子数组。是否可以借鉴划分过程设定三个指针完成一次遍历完成重新排列,使得所有的球排列成三类不同颜色的球?

(1)设置三个指针: 一个前指针begin,一个中指针current,一个后指针。

current指针遍历整个数组序列

(2)当current指针所指元素为0时,与begin指针所指的元素进行交换(只是交换元素不交换指针位置),然后current++,begin++

(3)当current指针所指元素为1时,不做任何交换(即不移动球),然后current++

(4)当current指针所指元素为2时,与end指针所指的元素进行交换(同样直交换元素不交换指针位置),然后current指针位置不动,end--

参考代码:

#include <bits/stdc++.h>

using namespace std;

void FranceFlag( int *a , int n )
{
int begin = ;
int current = ;
int end = n - ;
while( current <= end )
{
if( a[current] == )
{
swap( a[begin] , a[current] );
begin++;
current++;
}
else if( a[current] == )
{
current++;
}
else
{
swap( a[end], a[current] );
end--;
}
}
for( int i = ; i < n ; i ++ )
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int main()
{
int a[] = {,,,,,,,,,};
FranceFlag(a,);
}

GCC运行结果:

举一反三:

给定一个只有R、G、B三个字符的字符串,请重新排列该字符串中的字符,使得新字符串中的各个字符的排序顺序为:R在前,G在中,B在后。要求空间复杂度为O(1)且只能遍历一次字符串

转载请注明:www.cnblogs.com/zpfbuaa

荷兰国旗 Flag of the Kingdom of the Netherlands的更多相关文章

  1. Coursera Algorithms week2 基础排序 练习测验: Dutch national flag 荷兰国旗问题算法

    第二周课程的Elementray Sorts部分练习测验Interview Questions的第3题荷兰国旗问题很有意思.题目的原文描述如下: Dutch national flag. Given ...

  2. ACM 荷兰国旗问题

    荷兰国旗问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列,要 ...

  3. July收集荷兰国旗问题之三路partition

    这道题目和分成两块的partition的扩展.比如有一堆0 1 2 数字组成的数组,要分成 00 00  11 1 1  222 2这样的顺序的. 利用lumoto版的partition能够非常好的解 ...

  4. 算法笔记_051:荷兰国旗问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为 ...

  5. 荷兰国旗问题、快排以及BFPRT算法

    荷兰国旗问题 给定一个数组arr,和一个数num,请把小于num的数放数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N). 这个问题 ...

  6. NYOJ_268_荷兰国旗问题

    荷兰国旗问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描写叙述 荷兰国旗有三横条块构成,自上到下的三条块颜色依次为红.白.蓝.现有若干由红.白.蓝三种颜色的条块序列.要 ...

  7. Java实现荷兰国旗问题

    问题描述 现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球.白球.蓝球.这个问题之所以叫荷兰国旗,是因为将红白蓝三色的小球弄成条状物,并有序排列后 ...

  8. 快速排序与荷兰国旗及Partition问题

    快速排序与荷兰国旗及Partition问题 需求: 1.Partition过程 给定一个数组arr,和一个整数num.请把小于等于num的数放在数组的左边,大于num的数放在数组的右边. 要求额外空间 ...

  9. java荷兰国旗问题

    荷兰国旗包含三种颜色:红.白.蓝. 有三种颜色的球,算法的目标是将这三种球按颜色顺序正确地排列.它其实是三向切分快速排序的一种变种,在三向切分快速排序中,每次切分都将数组分成三个区间:小于切分元素.等 ...

随机推荐

  1. HtmlAgilityPack 处理通配的contains

    //选择不包含class属性的节点 var result = node.SelectNodes(".//span[not(@class)]"); //选择不包含class和id属性 ...

  2. 【转】NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

  3. LINQ的First与FirstOrDefault方法和Last与LastOrDefault方法。

    First与FirstOrDefault的方法,均是返回集合中的第一个元素,区别在于如果没有结果,前者(First)会有抛出异常,后者(FirstOrDefault)会返回默认值.Last与LastO ...

  4. 参考例子,学习Func<T, TResult>委托

    这些天,开发ASP.NET MVC,其间有查找资料,发现一个全新的Func<T, TResult> 委托.让我们在开发时,节省与简化很多. 在开发过程中,我们需要把一个泛型List< ...

  5. 【FTP】在自己的电脑上建立FTP服务器

    <1> 添加新用户: “计算机”点击右键 “管理”得到: 点击“本地用户和组”,点击“用户”: 右键 “新用户”: 设定用户名与密码,这是以后连FTP服务器时用的登录用户名与密码. < ...

  6. 使用DevExpress官方汉化文件对界面进行汉化的过程

    在较早期的Dev开发中,基本上都是在使用一个DLL包的汉化文件,如基于13.1的汉化包文件Dxper.LocalizationCHS.Win.v13.1.5.dll,这个汉化包也比较方便,大多数时候复 ...

  7. 用node-webkit(NW.js)创建桌面程序

    以往写windows桌面程序需要用MFC.C#之类的技术,那么如果你只会web开发技术呢?或者说你有一个网站,但是你想把你的网站打包成一个桌面应用程序,该如何做呢? 答案就是用node-webkit这 ...

  8. C#中在AxWebBrowser控件注入JS脚本的方法

    /// <summary> /// 窗体加载 /// </summary> private void JS_Load(object sender, EventArgs e) { ...

  9. 【算法和数据结构】_12_小算法_abs_fabsf_fabsd_大端小端判断

    最近学习要用到求绝对值函数,看了一下有很多种的abs函数,因此想自己实现这些代码. 下面是我进行测试的代码: #include <stdio.h> typedef unsigned int ...

  10. C++11 之 nullptr

    C++11 中,nullptr 是空指针,可用来给 (指向任意对象类型的) 指针赋值 广义整型 (integral types) = char, short, int, long, long long ...