classMinHeap: def__init__(self): self.__values: list = []
def__swap(self, i, j): self.__values[int(i)], self.__values[int(j)] = self.__values[int(j)], self.__values[int(i)]
defpush(self, data): self.__values.append(data) i = len(self.__values) - 1 while i != 0andself.__values[int(i)] < self.__values[int((i - 1) / 2)]: self.__swap(i, (i - 1) / 2) i -= 1 i /= 2
defpop(self): top = self.__values[0] self.__swap(0, len(self.__values) - 1) self.__values.pop() i = 0 whileTrue: left = 2 * i + 1 right = 2 * i + 2 max_ = i if left < len(self.__values) andself.__values[left] < self.__values[max_]: max_ = left if right < len(self.__values) andself.__values[right] < self.__values[max_]: max_ = right if max_ == i: break self.__swap(i, max_) i = max_ return top
defisEmpty(self): returnlen(self.__values) == 0
def__len__(self): returnlen(self.__values)
@staticmethod deffromList(data_list: list): heap = MinHeap() for i in data_list: heap.push(i) return heap