9. 荷兰国旗问题

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

#include 

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;
}

你可能感兴趣的:(9. 荷兰国旗问题)