今日目标:
- 理解堆(Heap)的基本概念,包括最大堆和最小堆。
- 掌握堆的插入、删除和堆排序算法。
- 了解堆在优先队列等数据结构中的应用。
1. 堆(Heap)的基本概念
- 堆是一种特殊的树形数据结构,通常使用数组来实现。
- 最大堆(Max Heap):父节点的值总是大于或等于其子节点的值。
- 最小堆(Min Heap):父节点的值总是小于或等于其子节点的值。
- 堆的根节点(在数组中的第一个元素)是最大值(最大堆)或最小值(最小堆)。
2. 堆的插入
- 将新元素添加到数组的末尾。
- 如果新元素比其父节点大(在最大堆中)或小(在最小堆中),则交换它们的位置。
- 重复此过程,直到新元素满足堆的性质。
3. 堆的删除
- 通常删除根节点(最大值或最小值)。
- 将根节点与数组的最后一个元素交换,并删除最后一个元素。
- 通过“下沉”操作恢复堆的性质:如果根节点的值小于其子节点(在最大堆中)或大于其子节点(在最小堆中),则与较大的子节点(最大堆)或较小的子节点(最小堆)交换位置。
- 重复此过程,直到根节点满足堆的性质。
4. 堆排序
- 堆排序是一种基于比较的排序算法,使用堆数据结构。
- 构建最大堆(或最小堆)。
- 重复删除根节点并将剩余元素重新调整为堆,直到堆为空。
- 删除的根节点按照排序顺序放置。
代码实现 (Python 示例 - 最大堆):
python复制代码
def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if left < n and arr[i] < arr[left]:
largest = left
if right < n and arr[largest] < arr[right]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
# 构建最大堆
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
# 一个个从堆顶取出元素
for i in range(n - 1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
# 示例数组
arr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("Sorted array is", arr)
注意:
- 堆排序的时间复杂度是O(n log n),其中n是数组的大小。
- 堆排序是不稳定的排序算法。
5. 堆的应用
- 优先队列:堆是实现优先队列的常用数据结构,其中最大堆用于实现最大优先队列,最小堆用于实现最小优先队列。
- 图算法:堆在诸如Dijkstra的最短路径算法和Prim的最小生成树算法中都有应用。
- 内存管理:某些内存管理算法使用堆数据结构来管理内存块。
今日总结:
今天学习了堆的基本概念,包括最大堆和最小堆,以及堆的插入、删除和排序算法。通过Python代码示例,实践了最大堆的构建和堆排序算法。此外,还了解了堆在优先队列等数据结构中的应用。堆是一种非常有用的数据结构,特别适用于需要快速查找最大值或最小值以及维护有序集合的场景。