码迷,mamicode.com
首页 > 其他好文 > 详细

荷兰国旗问题

时间:2014-10-11 23:18:06      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   for   sp   div   问题   

荷兰国旗有三横条块构成,自上到下的三条颜色依次为红,白,蓝。现有若干由红,白,蓝三种颜色的条块序列,要将它们重新排列使所有相同颜色的条块在一起。本问题要求将所有红色的条块放在最左边,所有白色的条块放在中间,所有蓝色的条块放在最右边。

//条块颜色依次存放在L[0,1,2........n-1]中算法利用快速排序思想,将整个序列按红,白,蓝排序。

思想:

设置三个整数r,w,b,其中r指向红色条块区域的下一个单元,w指向白色区域的下一个单元,b指向蓝色条块区的下一个单元。

开始时,令r和w为0,b为n-1,w相当于快速排序的low指针,b相当于快速排序的的hight指针。

最终L[0....r-1]存放红色条块,L[r....w-1]存放白色区域,L[w....n-1]存放蓝色条块区域。

检查L[w]有一些三种情况:

(1)如果L[w]=2它已经在白色区域,w直接加1.

(2)如果L[w]=3则将它加到蓝色区域头部,即L[w]与L[b]交换,且b减1.

(3)如果L[w]=1,此时先将白色区域的第一个元素(即红色区域的下一个单元)移动到白色区域末尾,再将它加到红色区域的下一个

单元.即L[w]与L[r]交换,且r和w同时加1.

重复上述操作直到w>b为止。

#define LOCAL
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
typedef int ElemType;
const int maxSize=45;
void Sort(int L[],int n)
{
    int x,r,w,b;
    r=w=0;  //相当于low=0
    b=n-1;  //相当于hight
    while(w<=b)
    {
        x=L[w];
        if(x==1)
        {
            L[w]=L[r];
            w++;
            L[r]=x;
            r++;
        }else if(x==2){
            w++;
        }else{
            L[w]=L[b];
            L[b]=x;
            b--;
        }
    }
}
void Output(int L[],int n)
{
    for(int i=0;i<n;i++)
     {
         cout<<L[i]<<",";
     }
     cout<<endl;
}
int main()
{
#ifdef LOCAL
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
#endif    
     int i=0,L[maxSize];
     for(i=0;i<maxSize;i++)
     {
         cin>>L[i];
     }
     Sort(L,maxSize);
     Output(L,maxSize);
    return 0;
}

 

荷兰国旗问题

标签:style   blog   color   io   os   for   sp   div   问题   

原文地址:http://www.cnblogs.com/jianfengyun/p/4019846.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!