首页 > 代码库 > 荷兰国旗问题

荷兰国旗问题

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

//条块颜色依次存放在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;}

 

荷兰国旗问题