荷兰国旗

来源:互联网 发布:excel2003软件官方下载 编辑:程序博客网 时间:2024/04/19 01:32

题目:

拿破仑席卷欧洲大陆之后,代表自由,平等,博爱的竖色三色旗也风靡一时。荷兰国旗就是一面三色旗(只不过是横向的),自上而下为红白蓝三色。该问题本身是关于三色球排序和分类的,由荷兰科学家Dijkstra提出。由于问题中的三色小球有序排列后正好分为三类,Dijkstra就想象成他母国的国旗,于是问题也就被命名为荷兰旗问题(Dutch National Flag Problem)。

下面是问题的正规描述:
现有n个红白蓝三种不同颜色的小球,乱序排列在一起,请通过两两交换任意两个球,使得从左至右,依次是一些红球、一些白球、一些蓝球。

 

思路:和快速排序有点类似


#include <stdio.h>#include <stdlib.h>#include <string.h>void swap(char *a, char *b){    char tmp = *a;    *a = *b;    *b = tmp;}/*说明:现有n个红白蓝三种不同颜色的小球乱序排列在一起,请通过两两交换任意两个球使得从左至右,依次是一些红球、一些白球、一些蓝球*/void sortDNFP(char* s, int n){    int cur = 0;    int end = n-1;    int red = 0;        while (cur <= end)    {        /*遇到红球直接交换*/        if (s[cur] == 'r')        {            swap(&s[cur], &s[red]);            cur++;            red++;        }        /*遇到白球直接cur++*/        else if (s[cur] == 'w')        {            cur++;        }        /*遇到蓝球,交换,但是cur不能动*/        else if (s[cur] == 'b')        {            swap(&s[cur], &s[end]);            end--;        }        else        {            /*do nothing*/        }    }}int main(){    char s[] = "rwbwbrwbrbrw";    sortDNFP(s, strlen(s));    printf("%s\n", s);    return 0;}


0 0
原创粉丝点击