返回
二叉堆:一种特殊的数据结构,巧用堆排序
前端
2023-09-11 17:38:20
二叉堆的定义
二叉堆是一种特殊的二叉树,具有两个特性:
- 它是一棵完全二叉树,表示树的每一层都有左侧和右侧子节点(除了最后一层的叶节点);
- 并且最后一层的叶节点尽可能都是左侧子节点,这叫作结构特性。
举个简单的例子:
1
/ \
2 3
/ \ / \
4 5 6 7
这就是一个二叉堆,它是一棵完全二叉树,并且最后一层的叶节点都集中在左侧。
二叉堆的类型
二叉堆主要分为两大类:最小二叉堆和最大二叉堆。
- 最小二叉堆:在最小二叉堆中,每个节点的值都小于或等于其子节点的值。
- 最大二叉堆:在最大二叉堆中,每个节点的值都大于或等于其子节点的值。
二叉堆的应用
二叉堆具有广泛的应用,包括:
- 优先级队列:二叉堆可以实现优先级队列,在优先级队列中,元素按照优先级从高到低排序。
- 堆排序:堆排序是一种基于二叉堆的排序算法,它具有平均时间复杂度为 O(n log n) 的高效性能。
二叉堆的实现
二叉堆可以通过数组或链表来实现,数组实现更为简单,且可以减少内存的使用。
以下是使用数组实现二叉堆的代码示例:
class BinaryHeap:
def __init__(self):
self.heap = []
def insert(self, value):
self.heap.append(value)
self.heapify_up()
def heapify_up(self):
index = len(self.heap) - 1
while index > 0:
parent_index = (index - 1) // 2
if self.heap[index] < self.heap[parent_index]:
self.heap[index], self.heap[parent_index] = self.heap[parent_index], self.heap[index]
index = parent_index
else:
break
def extract_min(self):
if len(self.heap) == 0:
return None
min_value = self.heap[0]
self.heap[0] = self.heap.pop()
self.heapify_down()
return min_value
def heapify_down(self):
index = 0
while index < len(self.heap):
left_index = 2 * index + 1
right_index = 2 * index + 2
smallest_index = index
if left_index < len(self.heap) and self.heap[left_index] < self.heap[smallest_index]:
smallest_index = left_index
if right_index < len(self.heap) and self.heap[right_index] < self.heap[smallest_index]:
smallest_index = right_index
if smallest_index != index:
self.heap[index], self.heap[smallest_index] = self.heap[smallest_index], self.heap[index]
index = smallest_index
else:
break
if __name__ == "__main__":
heap = BinaryHeap()
heap.insert(5)
heap.insert(3)
heap.insert(1)
heap.insert(2)
heap.insert(4)
print(heap.extract_min()) # 1
print(heap.extract_min()) # 2
print(heap.extract_min()) # 3
print(heap.extract_min()) # 4
print(heap.extract_min()) # 5
二叉堆的总结
二叉堆是一种特殊的二叉树,它具有完全二叉树和结构特性的特点,并具有广泛的应用,例如优先级队列和堆排序。二叉堆的实现可以采用数组或链表,其中数组实现更为简单。通过数组实现二叉堆,我们可以轻松实现插入、删除和查找最小值等操作。