荷蘭國旗

荷蘭國旗

題目描述:

拿破侖席卷歐洲大陸之后,代表自由,平等刁岸,博愛的豎色三色旗也風(fēng)靡一時。荷蘭國旗就是一面三色旗(只不過是橫向的)她我,自上而下為紅白藍(lán)三色虹曙。

三色球和荷蘭國旗

該問題本身是關(guān)于三色球排序和分類的,由荷蘭科學(xué)家 Dijkstra 提出番舆。由于問題中的三色小球有序排列后正好分為三類酝碳, Dijkstra 就想象成他母國的國旗,于是問題也就被命名為荷蘭旗問題(Dutch National Flag Problem)合蔽。

下面是問題的正規(guī)描述: 現(xiàn)有 n 個紅白藍(lán)三種不同顏色的小球击敌,亂序排列在一起介返,請通過兩兩交換任意兩個球拴事,使得從左至右,依次是一些紅球圣蝎、一些白球刃宵、一些藍(lán)球。

為了方便討論徘公,用數(shù)字 0 表示紅球牲证,用數(shù)字 1 表示白球,用數(shù)字 2 表示藍(lán)球关面,所以最后要求的數(shù)字排列是 0坦袍,...,1等太,...捂齐,2,... 缩抡。

分析和解法:

初看此題奠宜,貌似除了暴力解決并無好的辦法,但是可以聯(lián)想到剛才用過的快排算法瞻想⊙拐妫快速排序依托于一個 partition 分治過程,在每一趟排序的過程中蘑险,選取的主元都會把整個數(shù)組排列成一大一小的部分滴肿,那么我們可以借鑒一下。

解法一:

通過前面的分析得知佃迄,這個問題類似快排中 partition 過程泼差,只是需要用到三個指針:一個前指針 begin竿音,一個中指針 current ,一個后指針 end拴驮, current 指針遍歷整個數(shù)組序列春瞬,當(dāng)

  • current 指針?biāo)冈貫?0 時,與 begin 指針?biāo)傅脑亟粨Q套啤,而后 current++宽气,begin++ ;
  • current 指針?biāo)冈貫?1 時潜沦,不做任何交換(即球不動)萄涯,而后 current++ ;
  • current 指針?biāo)冈貫?2 時唆鸡,與 end 指針?biāo)傅脑亟粨Q涝影,而后, current 指針不動争占,end-- 燃逻。

源代碼如下:

#include <iostream>

using namespace std;

void Swap(int& a, int& b)
{
    int temp = a;
    a = b;
    b = temp;   
} 

int main()
{
    int a[100];
    int n = 0;
    while(cin.peek() != '\n')    cin >> a[n++];
    int *begin, *current, *end;
    begin = &a[0];
    current = &a[0];
    end = &a[n - 1];
    while(current <= end)
    {
        if (*current == 0)
        {
            Swap(*current, *begin);
            current++;
            begin++;
        }
        else if (*current == 1)
            current++;
        else 
        {
            Swap(*current, *end);
            end--;  
        }   
        for (int i = 0; i < n; i++)
        cout << a[i] << " " ;
    cout << endl;
    } 
    for (int i = 0; i < n; i++)
        cout << a[i] << " " ;
    cout << endl;
    return 0;
}

分析:時間復(fù)雜度為 O(n)。

特別注意:

當(dāng)然如果不限制空間的話臂痕,我們還有其他更簡單的方法伯襟。

參考資料:《編程之法》The Art of Programming By July

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市握童,隨后出現(xiàn)的幾起案子姆怪,更是在濱河造成了極大的恐慌,老刑警劉巖澡绩,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稽揭,死亡現(xiàn)場離奇詭異,居然都是意外死亡肥卡,警方通過查閱死者的電腦和手機溪掀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來召调,“玉大人膨桥,你說我怎么就攤上這事∵肱眩” “怎么了只嚣?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艺沼。 經(jīng)常有香客問我册舞,道長,這世上最難降的妖魔是什么障般? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任调鲸,我火速辦了婚禮盛杰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藐石。我一直安慰自己即供,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布于微。 她就那樣靜靜地躺著逗嫡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪株依。 梳的紋絲不亂的頭發(fā)上驱证,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音恋腕,去河邊找鬼抹锄。 笑死,一個胖子當(dāng)著我的面吹牛荠藤,可吹牛的內(nèi)容都是我干的伙单。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼商源,長吁一口氣:“原來是場噩夢啊……” “哼车份!你這毒婦竟也來了谋减?” 一聲冷哼從身側(cè)響起牡彻,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎出爹,沒想到半個月后庄吼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡严就,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年总寻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢为。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡渐行,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出铸董,到底是詐尸還是另有隱情祟印,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布粟害,位于F島的核電站蕴忆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏悲幅。R本人自食惡果不足惜套鹅,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一站蝠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧卓鹿,春花似錦菱魔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拔疚,卻和暖如春肥隆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稚失。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工栋艳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句各。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓吸占,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凿宾。 傳聞我的和親對象是個殘疾皇子矾屯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • Given an array with n objects colored red, white or blue,...
    stevewang閱讀 893評論 0 0
  • tips:本文章內(nèi)容來自《程序員編程藝術(shù):面試和算法心得》給定一個字符串里面只有"R" "G" "B" 三個字符,...
    tomchan閱讀 2,030評論 1 3
  • 近期更新:最后面有python版本 問題:現(xiàn)有紅白藍(lán)三個不同顏色的小球初厚,亂序排列在一起件蚕,請重新排列這些小球,使得紅...
    抬頭挺胸才算活著閱讀 1,901評論 0 0
  • 問題:現(xiàn)有紅产禾,白排作,藍(lán)三個不同顏色的小球,亂序排列在一起亚情,請重新排列這些小球妄痪,使得紅白藍(lán)三色的同顏色球在一起。紅白藍(lán)...
    Albert_Sun閱讀 444評論 0 0
  • 題意:把n個紅楞件、白衫生、藍(lán)三種不同顏色的小球,亂序排列在一起土浸,請通過兩兩交換任意兩球的方式罪针,使得從左到右小球的顏色依次...
    鬼谷神奇閱讀 503評論 0 0