优先级队列,堆是比较常用的数据结构,分支限界法,贪心法均会用到优先级队列
有必要了解一下优先级队列的实现方式
def siftUp(arr,insert_index,insert_value):
child_pointer = insert_index
parent_pointer = (child_pointer-1)//2
pivot = insert_value
while parent_pointer >=0 and arr[parent_pointer] < pivot:
arr[child_pointer] = arr[parent_pointer]
child_pointer = parent_pointer
parent_pointer = (child_pointer-1)//2
arr[child_pointer] = pivot
def siftDown(arr,insert_index,insert_value):
end_index = len(arr)-1
parent_pointer = insert_index
child_pointer = 2*parent_pointer + 1
pivot = insert_value
while child_pointer <= end_index:
if child_pointer + 1 <= end_index and arr[child_pointer + 1] >arr[child_pointer]:
child_pointer +=1
if pivot >= arr[child_pointer]:
break
else:
arr[parent_pointer] = arr[child_pointer]
parent_pointer = child_pointer
child_pointer = 2*parent_pointer + 1
arr[parent_pointer] = pivot
def buildHeapBySiftUp(arr):
for i in range(len(arr)):
siftUp(arr,i,arr[i])
def buildHeapBySiftDown(arr):
for i in range((len(arr)-1)//2 -1,-1,-1):
siftDown(arr,i,arr[i])
代码测试
arr =[1,2,3,4,5,6]
buildHeapBySiftUp(arr)
print(arr)
siftDown(arr,0,0)
print(arr)
arr3=[0,1,2,3,4,5,6]
print(arr3)
buildHeapBySiftDown(arr3)
print(arr3)
runfile('D:/share/test/heapqueue.py', wdir='D:/share/test')
[6, 4, 5, 1, 3, 2]
[5, 4, 2, 1, 3, 0]
[0, 1, 2, 3, 4, 5, 6]
[6, 4, 5, 3, 1, 0, 2]