荷蘭國旗問題

2021-06-21 16:57:51 字數 892 閱讀 2904

【演算法設計與分析基礎4.2-9】

荷蘭國旗問題要求對字元r、w和b構成的任意陣列排序(紅、白和藍是荷蘭國旗的顏色),使得所有r排在最前面,w隨後,b在最後。為該問題設計乙個線性效率的在位演算法。

【演算法】

假設陣列的狀態如下

a[0] ... a[r-1]a[r] ... a[w -1] a[w] ... a[b]a[b+1] ... a[n -1]

全部填r          全部填w             未處理部分                 全部填b

下一步處理a[w],假如a[w]的值為r,則交換(a[r],a[w]),同時r <- r + 1, w <- w + 1。假如a[w]的值為w,只需要w <- w + 1。假如a[w]的值為b,交換(a[w],a[b]),同時b <- b -1,因為a[b]的值是未知的,我們需要對其進行判斷,所以w不需要往前移。

偽**:

dutchflag(a[0...n-1])

r <- 0; w <- 0; b <- n-1

while w <= b do

if a[w] ='r'

swap(a[r], a[w]);  r <- r+1; w <- w+1;

else if a[w] ='w'

w <- w+1;

else

swap(a[w], a[b]);  b <- b-1 

【**】

#include #include #include void swap(char *a, char *b)

void dutchflag(char a, int n)

}int main(void)

荷蘭國旗問題

上方的便是乙個荷蘭國旗,從圖中我們可以很清楚的看出它的特點,它有三個區域組成,即紅,白,藍。好,現在我們的問題出來了。現在我們面前有一張桌子,桌子上整齊的擺放著紅色,白色,藍色三種線條,但他們的順序是凌亂的。我們的要求是 用乙個演算法把這些線條挑出來重新擺放順序,最後的結果就像上圖的荷蘭國旗,紅色在...

荷蘭國旗問題

問題 荷蘭國旗是由紅白藍三種顏色組成,現假設很多這三種顏色的線被打亂放置,要求從頭掃瞄一遍,3種顏色自然分開,顏色順序是紅,白,藍。問題分析 1 編碼 題目中有三種顏色,可以用0 紅,1 白,2 藍進行編碼。3 演算法 a 把n個0,1,2三種元素隨機放入陣列模擬很多這三種顏色的線被打亂放置的場景 ...

荷蘭國旗問題

荷蘭的國旗由紅色 白色和藍色3種顏色組成。現在假設有很多這3種顏色的線被存放在乙個陣列裡,要求每次操作僅能進行一次交換,在原陣列的基礎上操作。待對陣列進行一遍掃瞄後,3種顏色自然分開,顏色順序為紅 白 藍。另外,要求在o n 的複雜度下,是移動次數最少。荷蘭國旗問題 include include ...