9. 荷兰国旗问题

题意:把n个红、白、蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两球的方式,使得从左到右小球的颜色依次为红、白、蓝。红、白、蓝分别用0、1、2表示。
算法思想:借鉴快速排序划分法,设置三个指针——begin、middle、end,分别指向0、1、2。

#include <stdio.h>

void swap(int * a, int * b)
{
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main()
{
    freopen("in.txt", "r", stdin);

    int n, buf[100];

    while(scanf("%d", &n) != EOF)
    {
        for(int i = 1; i <= n; ++i)
            scanf("%d", &buf[i]);

        int begin, middle, end;
        begin = middle = 1;
        end = n;

        while(middle <= end)
        {
            if(buf[middle] == 0)
            {
                swap(&buf[begin], &buf[middle]);
                begin++;
                middle++;
            }
            else if(buf[middle] == 2)
            {
                swap(&buf[middle], &buf[end]);
                end--;  //end可能指向0,所以middle不可以右移
            }
            else
                middle++;
        }

        for(int i = 1; i <= n; ++i)
            printf("%d ", buf[i]);
        printf("\n");

    }

    return 0;
}

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,438评论 0 33
  • 翻开趁早日记本,健身计划下有一行字触目惊心:2015年过去一半,如果年初就开始打卡坚持,应该已然脱胎换骨了。劳动节...
    薛定谔猫猫阅读 259评论 0 1
  • 第一次做手帐,第一次用简书发日迹,感觉棒棒哒 今天一整天的感受就是: 今朝有酒今朝醉,总是情字使人累。 酒酣无语情...
    雨落青黎rain阅读 138评论 0 0
  • 夜守紫禁会议门 八尺男儿躯 双目似冰如有神 灯随路远去 寒袭志不移 望京都 叹长息 星稀车漫漫 凄身会中心 何日飞...
    拿什么拯救地球阅读 133评论 0 0
  • 人与人只间交流当然要说话,有些话可以影响一个人的一生,有些话让人难忘,比如老师的教诲,父母的关心,都让我们...
    平淡很华阅读 95评论 0 0