演算法與資料結構 荷蘭國旗問題

2022-04-27 10:45:12 字數 670 閱讀 3005

問題:給定乙個無序陣列arr,元素只有0,1,2三種取值

要求:重新排列陣列,使得所有值為0的元素在陣列左邊,值為1的元素在陣列右邊,值為2的元素在陣列中間。

思路:設三種陣列索引,mid, left, right, 假設一種中間過程,[0, left) 區間內元素的值為0,(right, len-1] 區間內元素為1, [left, mid)區間內元素為2,[mid, right] 區間內元素未排序

arr[mid]的值分為3種情況:

1. arr[mid] == 2, 為保持中間狀態,mid向右移動一步即可

2. arr[mid] == 0, 因為arr[left]為2, 交換arr[mid]和arr[left],  left和mid各向右移動一步

3. arr[mid] == 1, 交換arr[right]和arr[mid], right向左移動一步

依據上述的迭代方法,最終可以使得[mid, right]區間為空,到這裡時,迭代完成。此時mid>right。因此只要mid<=right就必須不斷迭代。

依據上述思路,可以很快寫出**:

void rearrange(int* arr, int

len)

else

if (val == 2

)

else

}}

演算法 荷蘭國旗問題

荷蘭國旗是由紅白藍3種顏色的條紋拼接而成,如下圖所示 假設這樣的條紋有多條,且各種顏色的數量不一,並且隨機組成了乙個新的圖形,新的圖形可能如下圖所示,但是絕非只有這一種情況 需求是 把這些條紋按照顏色排好,紅色的在上半部分,白色的在中間部分,藍色的在下半部分,我們把這類問題稱作荷蘭國旗問題。我們把荷...

資料結構 排序 荷蘭國旗詳解

荷蘭國旗 將給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的左邊,等於num的數放在陣列的中間,大於num的數放在陣列的右邊。要求額外空間複雜度o 1 時間複雜度o n 思路 需要三個指標 小於num指標small 等於num指標equal 大於num指標big 有以下三種情況 1 ...

演算法之荷蘭國旗問題

問題描述 荷蘭國旗有三橫條塊構成,自上到下的三條顏色依次為紅,白,藍。現有若干由紅,白,藍三種顏色的條塊序列,要將它們重新排列使所有相同顏色的條塊在一起。本問題要求將所有紅色的條塊放在最左邊,所有白色的條塊放在中間,所有藍色的條塊放在最右邊。解決辦法 將三種顏色放入乙個數字中,前部分為紅色,中間部分...