zoukankan      html  css  js  c++  java
  • 荷兰国旗问题

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

    //条块颜色依次存放在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;
    }
  • 相关阅读:
    python 将字符串作为脚本运行
    Django Model获取字段名称并转为List存储
    django 过滤查询
    django 视图中异步执行python脚本
    python 异步执行python脚本
    django 筛选不等于的内容
    phpstorm中快速添加函数注释
    搜索模板elasticsearch
    laravel模型关联
    laravel关联用户
  • 原文地址:https://www.cnblogs.com/jianfengyun/p/4019846.html
Copyright © 2011-2022 走看看