from typing import List
class Heap:
arr = []
def __init__(self) -> None:
self.arr = []
def __init__(self, arr: List[int]) -> None:
self.arr = arr
self._build(arr)
def _build(self, arr: List[int]) -> None:
for i in range(len(arr) // 2 - 1, -1, -1):
self._max_heapify(arr, i)
def _max_heapify(self, arr: List[int], p_index: int) -> None:
left = self._left(p_index)
right = self._right(p_index)
largest = p_index
if left < len(arr) and arr[p_index] < arr[left]:
largest = left
if right < len(arr) and arr[largest] < arr[right]:
largest = right
if largest != p_index:
tmp = arr[p_index]
arr[p_index] = arr[largest]
arr[largest] = tmp
self._max_heapify(arr, largest)
def _parent(self, index: int) -> int:
"""
reutrn -1 if index is root node
"""
if index == 0:
return -1
return index // 2
def _left(self, p_index: int) -> int:
"""
left leaves index
"""
return 2 * p_index + 1
def _right(self, p_index: int) -> int:
"""
right leaves index
"""
return 2 * p_index + 2
def put(self, value: int) -> None:
self.arr.append(value)
self._max_heapify(self.arr, self._parent(len(self.arr) - 1))
def popTop(self) -> int:
res = self.arr[0]
self.arr[0] = self.arr[-1]
del self.arr[-1]
self._max_heapify(self.arr, 0)
return res
def all(self) -> List[int]:
return self.arr
参考:
斯坦福课件材料