荷兰国旗

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

荷兰国旗_第1张图片

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

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

荷兰国旗_第2张图片

荷兰国旗_第3张图片

荷兰国旗_第4张图片

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; iarray[i]<<" ";
    }
    cout<"pause");
    return 0;
}

你可能感兴趣的:(面试题)