详解如代码显示
# 荷兰国旗问题 分三块
# 在arr[L...R]上,根据P(划分值)分块,<p 在左边;==p 的中间; >p的,在右边
# 返回值,是一定会返回一个长度为2的数组,记录等于区域的左右边界
# arr = [ ... 3 5 5 4 6 7 ... ]
# index = 4 5 6 7 8 9
# p = 5
#arr = [ ... (3 4) 5 5 (6 7 )... ]
#荷兰国旗问题有一个核心就是partition,返回值就是等于区域的左右边界
def swap(arr,i,j):
tmp = arr[i]
arr[i] = arr[j]
arr[j] = tmp
def partiton(arr,L,R,P):
less = L -1 # <区域的右边界
more = R +1 # >区域的左边界
index = L
while(index < more):
'''
如果当前数小于划分值:
(1)当前数与小于区域的下一个值交换,
(2)小于区域向右扩
(3)当前数跳下一个
'''
if arr[index]<P:
swap(arr,index,less+1)#(1)
less += 1 #(2)
index += 1 #(3)
#如果当前数大于划分值:
#(1)当前数与大于区域的前一个数交换
#(2)大于区域向左扩
#(3)当前数不动
elif arr[index]>P:
swap(arr,index,more-1)# 对应(1)
more -= 1 # (2)
#如果当前数等于划分值:
#当前数直接跳下一个
else:
index+=1
return [less+1,more-1]
if __name__ == "__main__":
arr = [1,5,6,8,3,4,9,2,9,7]
#index:0 1 2 3 4 5 6 7 8 9
print(arr)
res = []
res = partiton(arr,0,len(arr)-1,5)
print(res[0])
print(res[1])
print(arr)