荷蘭國旗問題(partition)總結

2021-09-17 19:49:41 字數 2502 閱讀 6361

在之前總結的的快速排序演算法中,用到了partition演算法,故今天來總結下partition演算法和其應用

partition演算法,又稱為荷蘭國旗問題,其主要包括兩個問題。

2 問題2-三分partition

3 partition演算法應用

給定乙個陣列a和乙個數n,把小於等於n的數字放在陣列的左邊,大於n的數放在陣列的右邊,要求額外空間複雜度o(1),時間複雜度o(n)

1、首先定義兩個下標:

下標1:less=-1,表示<=n的區域;

下標2:p=0,表示當前值所在位置。

2、接著進行判斷:

1)當前值<=劃分值n(也叫基準值/樞軸),則當前數與<=區域的下乙個數交換,然後<=區域擴大一位(即less+1),並且當前值指標p跳下乙個

2)當前值》n,則當前值指標p直接跳下乙個

###荷蘭國旗問題——問題1

def partition_q1(arr,n):

less = -1

p = 0

while p < len(arr):

if arr[p] <= n:

arr[less+1],arr[p] = arr[p],arr[less+1]

less += 1

p += 1

else:

p += 1

return arr

測試用例1:partition_q1([5,3,2,5,68,1,2],4)

輸出:[3, 2, 1, 2, 68, 5, 5]]

測試用例2:partition_q1([4,5,545,4,5],3)

輸出:[4, 5, 545, 4, 5]

給定乙個陣列a和乙個數n,把小於n的數字放在陣列的左邊,等於n的數字放中間,大於n的數放在陣列的右邊,要求額外空間複雜度o(1),時間複雜度o(n)

1、此時可以定義三個下標:

下標1:less=-1,表示小於n的區域;

下標2:more=len(a),表示大於n的區域

下標3:p=0,表示當前位置

2、 判斷:

1)當前值=n,p指標直接跳下乙個

2)當之值區域擴大一位(即more-1),特別注意當前指標位置不變

*(與《區域交換後直接跳下乙個不同的是,這裡並不確定換過來的數與n的關係,所以要對該數進行判斷)*

4)當前數與》區域撞上,則停止整個過程

###荷蘭國旗問題——問題2

def partition_q2(arr,n):

less = -1

more = len(arr)

p = 0

while p < more:

if arr[p] < n:

arr[p],arr[less+1] = arr[less+1],arr[p]

less += 1

p += 1

elif arr[p] == n:

p += 1

else:

arr[p],arr[more-1] = arr[more-1],arr[p]

more -= 1

return arr

測試用例1:partition_q2([5,3,2,5,68,1,2],3)

輸出:[2, 2, 1, 3, 68, 5, 5]

測試用例2:partition_q2([4,5,545,4,5],3)

輸出:[5, 545, 4, 5, 4]

見之前總結的文章

使用partition演算法將陣列分為大於首元素的部分,等於首元素的部分和小於首元素的部分,然後判斷k在那哪個部分中,遞迴的進行partition

**實現

class solution:

def findkthlargest(self, nums: list[int], k: int) -> int:

if not nums:

return

#parition分為三部分

l = [i for i in nums if i > nums[0]]

m = [i for i in nums if i == nums[0]]

r = [i for i in nums if i < nums[0]]

#判斷k的位置

if k <= len(l):

return self.findkthlargest(l,k)

elif k <= len(l) + len(m):

return nums[0]

else:

return self.findkthlargest(r,k-len(l)-len(m))

荷蘭國旗問題

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

荷蘭國旗問題

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

荷蘭國旗問題

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