You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.2 KiB
Python

class BinaryHeap:
def __init__(self, n):
self.heap = [0] * n
self.size = 0
def remove_min(self):
removed = self.heap[0]
self.size -= 1
self.heap[0] = self.heap[self.size]
self._down(0)
return removed
def add(self, value):
self.heap[self.size] = value
self._up(self.size)
self.size += 1
def _up(self, pos):
while pos > 0:
parent = (pos - 1) // 2
if self.heap[pos] >= self.heap[parent]:
break
self.heap[pos], self.heap[parent] = self.heap[parent], self.heap[pos]
pos = parent
def _down(self, pos):
while True:
child = 2 * pos + 1
if child >= self.size:
break
if child + 1 < self.size and self.heap[child + 1] < self.heap[child]:
child += 1
if self.heap[pos] <= self.heap[child]:
break
self.heap[pos], self.heap[child] = self.heap[child], self.heap[pos]
pos = child
def test():
h = BinaryHeap(10)
h.add(3)
h.add(1)
h.add(2)
print(h.remove_min())
print(h.remove_min())
print(h.remove_min())
test()