1. 程式人生 > >荷蘭國旗問題(顏色排序問題)

荷蘭國旗問題(顏色排序問題)

題目描述

  • Sort Colors

Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note:


You are not suppose to use the library’s sort function for this problem.
click to show follow up.
Follow up:
A rather straight forward solution is a two-pass algorithm using counting sort.
First, iterate the array counting number of 0’s, 1’s, and 2’s, then overwrite array with total number of 0’s, then 1’s and followed by 2’s.
Could you come up with an one-pass algorithm using only constant space?

題目大意

給定一個有n個物件的陣列,陣列中有三種顏色,紅色、白色和藍色,對他們進行排序,相同顏色的在一起,排序順序是(1)紅色、(2)白色、(3)藍色。陣列是int型別的陣列,在陣列中用0表示紅色,1表示白色,2表示藍色。
必能用庫排序函式。

思路

題目中給出了一種思路是,遍歷兩次陣列,第一次遍歷統計其中0、1、2的個數,第二次遍歷把陣列中的值按照0、1、2的個數重新覆蓋。
但這種方法不可取,用只用一次遍歷的做法來做。
問題就成了荷蘭國旗問題:

  • ”荷蘭國旗難題“問題描述

”荷蘭國旗難題“是電腦科學中的一個程式難題,它是由Edsger Dijkstra提出的。荷蘭國旗是由紅、白、藍三色組成的。

現在有若干個紅、白、藍三種顏色的球隨機排列成一條直線。現在我們的任務是把這些球按照紅、白、藍排序。

我的思路如下:
設定3個變數,分別代表陣列前部zeroindex,當前遍歷的位置 i,陣列後部 twoindex
(1)當A[i] = 0時,必然屬於陣列前部,則交換A[i] 和 A[zeroindex] ,接著i++ , zeroindex++
(2)當A[i] = 1時,只需i++就好,因為只有排好了0和2,1自然就只能在中間了,故不作處理
(3)當A[i] = 2時,不然屬於陣列後部,則交換A[i]和A[twoindex],接著twoindex–,不過此時就不能i++了,因為,交換過去的A[i]有可能是0或者2,所以需要在下一個迴圈裡判斷,這樣它的位置才能夠正確。

程式碼

#include<iostream>
using namespace std;

void sortColors(int A[], int n)
{
    int start = 0;
    int end = n-1;
    int current = 0;
    while(current <= end)
    {
        if(A[current] < 1)
        {
            swap(A[current++], A[start++]);
        }
        else if(A[current] > 1)
        {
            // 交換過去的current有可能是0或者2
            // 所以得在下次迴圈判斷
            swap(A[current], A[end--]);
        }
        else
        {
            current++;
        }
    }
}

int main()
{
    int A[] =
    {
        0, 1, 2,
        0, 2, 1,
        1, 0, 2,
        1, 2, 0,
        2, 0, 1,
        2, 1, 0
    };
    sortColors(A, 18);
    for(int i=0; i<18; i++)
    {
        cout<<A[i]<<' ';
    }
    cout<<endl;
    return 0;
}

以上。


版權宣告:本文為博主原創文章,轉載請註明出處。
個人部落格地址:https://yangyuanlin.club
歡迎來踩~~~~