荷蘭國旗問題

2021-09-11 01:46:59 字數 1592 閱讀 5097

問題:

給定乙個陣列arr,和乙個數num,請把小於num的數放在陣列的 左邊,等於num的數放在陣列的中間,大於num的數放在陣列的 右邊。

要求額外空間複雜度o(1),時間複雜度o(n)

思路:

從第乙個數開始逐個與num比較如果小於num則和小於num區域的下乙個位置的數交換,小於num區域擴大1,也就是less加一,cur也加1向後移動乙個,指向下乙個需要比較的數,如果大於num則將cur指向的數和大於num區域的前乙個位置的數交換,大於num區域擴大一,也就是more–,但是cur不動,將交換過來的數再與num進行比較,如果cur指向的數等於num,則位置不動,cue在指向下乙個數

假設給定一組資料 5,3,5,2,8,7,4

陣列的下標為0,1,2,3,4,5,6 num = 5

設定三個個變數乙個為less,指向下標-1位置,另乙個為more指向下標為7的位置,也就是arr.length位置,cur指向陣列第乙個數,也就是需要和num比較的數,0 - less為小於num的區域,more的右邊為大於num區域,中間為等於num區域,對於第乙個數5 = num,所以5的位置不動,cur向後移動乙個,

資料:5,3,5,2,8,7,4

第二個數3 < num,所以3和5交換位置,小於num的區域擴大1,也就是less加一,此時小於num區域中有乙個值為3,cur向後移動乙個,

資料:3,5,5,2,8,7,4

第三個數5 = num,所以位置不動,cur向後移動乙個,

資料:3,5,5,2,8,7,4

第四個數2 < num,所以2和小於num區域的下乙個數交換位置,然後小於num區域擴大1,cur向後移動乙個,此時小於num區域有兩個數3和2,

資料:3,2,5,5,8,7,4

第5個數8 > num,讓8和more位置前面位置4交換,more減一,也就是大於num的範圍擴大1,此時大於num區域的值為8,

資料:3,2,5,5,4,7,8

此時cur位置不動仍然指向4,比較4和num的大小,因為4 < num,所以將4和小於num區域的下乙個數5交換,cur向後移動乙個,

資料:3,2,4,5,5,7,8

第六個數7 > num 所以讓7和大於num區域前面位置的數交換,也就是和他本身進行交換,大於num區域擴大1,也就是more減一,因為more = num,也可以說因為此時已經劃分好資料所屬的區域,所以結束,

資料:3,2,4,5,5,7,8

**實現:

public

static

void

partition

(int

arr,

int l,

int r,

int num)

else

if(arr[cur]

> num)

else}}

public

static

void

swap

(int

arr,

int i,

int j)

荷蘭國旗問題

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

荷蘭國旗問題

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

荷蘭國旗問題

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