Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Heap:
- def __init__(self, compare):
- self.compare = compare
- self.data = []
- def _swap(self, a, b):
- buf = self.data[a]
- self.data[a] = self.data[b]
- self.data[b] = buf
- def _heapify(self, i):
- left = 2 * i
- right = left + 1
- largest = i
- if left < len(self.data) and self.compare(self.data[left], self.data[largest]):
- largest = left
- if right < len(self.data) and self.compare(self.data[right], self.data[largest]):
- largest = right
- if largest != i:
- self._swap(i, largest)
- self._heapify(largest)
- def push(self, element):
- self.data.append(element)
- i = len(self.data) - 1
- while i > 0 and self.compare(self.data[i], self.data[i // 2]):
- self._swap(i, i // 2)
- i = i // 2
- def pop(self, element=None):
- rv = self.data[0]
- self.data[0] = element if element is not None else self.data[len(self.data) - 1]
- self.data.pop(len(self.data) - 1)
- self._heapify(0)
- return rv
- @classmethod
- def build(cls, compare, arr):
- heap = cls(compare=compare)
- heap.data = arr
- for i in range(len(arr) // 2 - 1, -1, -1):
- heap._heapify(i)
- return heap
- @property
- def top(self):
- return self.data[0]
- def __len__(self):
- return len(self.data)
- def __repr__(self):
- return str(self.data)
- def print(self):
- i = 1
- while i <= len(self.data):
- print(self.data[i-1:i*2-1])
- i *= 2
- def less(a, b):
- return a < b
- def more(a, b):
- return a > b
- def main():
- h = Heap.build(more, [1, 2, 4, 10, 5, 6, 8, 11, 9, 16])
- print(h.data)
- h.print()
- if __name__ == '__main__':
- main()
Add Comment
Please, Sign In to add comment