荷兰国旗

来源:互联网 发布:电脑报 淘宝二手苹果 编辑:程序博客网 时间:2024/04/27 16:43

题目描述:现有n个红白蓝三种不同颜色的小球,乱序排在一起,请通过两两交换任意两个球,使得从左至右的球依次为红球白球蓝球。这个问题之所以叫荷兰国旗,是因为将红白蓝三色小球弄成条状物,并有序的排列后正好组成荷兰的国旗(图中球上标数字0的表示红球,1表示白球,2表示蓝球)

这里写图片描述

解法:需要三个指针,一个前指针begin,一个中指针current,一个后指针end,current指针

遍历整个数组序列:
(1)当current指针所指元素为0时,与begin指针所指的元素交换,然后current++,begin++;
(2)当current指针所指元素为1时,不做任何的元素交换(即不动球),然后current++;
(3)当current指针所指元素为2时,与end指针所指的元素交换,然后current不动,end–;(current指针与所指元素交换之后,current指针此刻指向0,此时指针不可动,与begin交换)

这里写图片描述

这里写图片描述

这里写图片描述

void RWBsort(int array[], int len){    int begin = 0;    int current = 0;    int end = len-1;    while(current < end)    {        if(array[current] == 0)        {            swap(array[current], array[begin]);            current++;            begin++;        }        else if(array[current] == 1)        {            current++;        }        else        {            swap(array[current], array[end]);            end--;        }    }}int main(){    int array[] = {2,0,1,0,0,2,1,1,2};    int length = sizeof(array)/sizeof(array[0]);    RWBsort(array, length);    for(int i=0; i<length; ++i)    {        cout<<array[i]<<" ";    }    cout<<endl;    system("pause");    return 0;}