在之前總結的的快速排序演算法中,用到了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 ...