演算法 荷蘭國旗問題

2021-10-03 16:44:47 字數 2737 閱讀 2108

荷蘭國旗是由紅白藍3種顏色的條紋拼接而成,如下圖所示:

假設這樣的條紋有多條,且各種顏色的數量不一,並且隨機組成了乙個新的圖形,新的圖形可能如下圖所示,但是絕非只有這一種情況:

需求是:把這些條紋按照顏色排好,紅色的在上半部分,白色的在中間部分,藍色的在下半部分,我們把這類問題稱作荷蘭國旗問題。

我們把荷蘭國旗問題用陣列的形式表達一下是這樣的:

給定乙個整數陣列,給定乙個值k,這個值在原陣列中一定存在,要求把陣列中小於k的元素放到陣列的左邊,大於k的元素放到陣列的右邊,等於k的元素放到陣列的中間,最終返回乙個整數陣列,其中只有兩個值,分別是等於k的陣列部分的左右兩個下標值。

例如,給定陣列:[2, 3, 1, 9, 7, 6, 1, 4, 5],給定乙個值4,那麼經過處理原陣列可能得一種情況是:[2, 3, 1, 1, 4, 9, 7, 6, 5],需要注意的是,小於4的部分不需要有序,大於4的部分也不需要有序,返回等於4部分的左右兩個下標,即[4, 4]

#

include

#include

#include

#include

template

<

typename

t>

std::ostream&

print

(std::ostream &out,t const

&val)

template

<

typenamet1,

typename

t2>

std::ostream&

print

(std::ostream &out,std::pair

const

&val) ")

;}template

<

template

<

typename

,typename..

.>

classtt,

typename..

. args>

std::ostream&

operator

<<

(std::ostream &out,tt

>

const

&cont)

void

swap

(int

& i,

int&j)

void

helan

(std::vector<

int>

&vec,

int value)

int left =-1

;int right = vec.

size()

;int curr =0;

while

(curr < right)

else

if(vec[curr]

> value)

else}}

intmain()

;helan

(vec,4)

; std::cout << vec;

return0;

}

我們以上面舉的例子來看看處理過程的圖示:

如果 arr[l] > 4, 交換 arr[–more] 和 arr[l] 的值

如果 arr[l] = 4, 不交換,l++,直接遍歷下乙個值

當 l >= more,退出迴圈。

;// 和p相等的邊界

}public

static

void

swap

(int

arr,

int i,

int j)

package

com.company

;public

class

test_stack

if(index == left)

else

}else

else}}

}public

static

void

main

(string

args)

;int

arrry =

;helan

(arrry,

0, arrry.length -1)

;for

(int i: arrry)

}}

演算法之荷蘭國旗問題

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

演算法習作 荷蘭國旗問題

出處 1.問題描述 我們將亂序的紅白藍三色小球排列成有序的紅白藍三色的同顏色在一起的小球組。這個問題之所以叫荷蘭國旗,是因為我們可以將紅白藍三色小球想象成條狀物,有序排列後正好組成荷蘭國旗。2.問題分析 這個問題我們可以將這個問題視為乙個陣列排序問題,這個陣列分為前部,中部和後部三個部分,每乙個元素...

荷蘭國旗演算法

問題 現有紅,白,藍三個不同顏色的小球,亂序排列在一起,請重新排列這些小球,使得紅白藍三色的同顏色的球在一起。問題轉化為 給定陣列a 0.n 1 元素只能取0,1,2三個值,設計演算法,使得陣列排列成00.0011.1122.222的形式。a cur 2,則a cur 與a end 交換,end c...