python将二叉堆实现为最大堆,并测试
时间: 2024-02-03 22:12:57 浏览: 21
好的,下面是一个简单的二叉堆最大堆实现和测试代码:
```python
class MaxHeap:
def __init__(self):
self.heap = []
def parent(self, i):
return (i - 1) // 2
def left(self, i):
return 2 * i + 1
def right(self, i):
return 2 * i + 2
def insert(self, k):
self.heap.append(k)
self.heapify_up(len(self.heap) - 1)
def extract_max(self):
max_value = self.heap[0]
self.heap[0] = self.heap[-1]
self.heap.pop()
self.heapify_down(0)
return max_value
def delete(self, i):
self.heap[i] = float('inf')
self.heapify_up(i)
self.extract_max()
def heapify_up(self, i):
while i > 0 and self.heap[i] > self.heap[self.parent(i)]:
self.heap[i], self.heap[self.parent(i)] = self.heap[self.parent(i)], self.heap[i]
i = self.parent(i)
def heapify_down(self, i):
l = self.left(i)
r = self.right(i)
largest = i
if l < len(self.heap) and self.heap[l] > self.heap[largest]:
largest = l
if r < len(self.heap) and self.heap[r] > self.heap[largest]:
largest = r
if largest != i:
self.heap[i], self.heap[largest] = self.heap[largest], self.heap[i]
self.heapify_down(largest)
# 测试代码
if __name__ == '__main__':
heap = MaxHeap()
nums = [1, 3, 2, 6, 5, 7, 8, 9, 10, 0]
for num in nums:
heap.insert(num)
print(heap.heap) # [10, 9, 8, 6, 5, 7, 2, 1, 3, 0]
print(heap.extract_max()) # 10
print(heap.heap) # [9, 6, 8, 1, 5, 7, 2, 0, 3]
heap.delete(3)
print(heap.heap) # [9, 6, 8, 3, 5, 7, 2, 0]
```
这段代码实现了一个最大堆,其中包含了插入、删除和提取最大值的操作,并且测试了这些操作的正确性。