学习目标:
- 掌握堆(Heap)的基本概念及性质。
- 实现堆的基本操作,如插入、删除等。
- 理解堆排序算法的原理和步骤。
- 实现堆排序算法。
学习内容:
1. 堆的基本概念
- 堆是一种特殊的完全二叉树,其每个父节点的值都大于或等于(对于最大堆)或小于或等于(对于最小堆)其子节点的值。
- 堆通常用数组来表示,数组中的每个元素都有一个父节点和两个子节点(对于非叶子节点)。
- 堆的两种类型:最大堆和最小堆。
2. 堆的性质
- 完全二叉树:堆总是一棵完全二叉树,这意味着除了最底层之外,其他层的节点都是满的,且最底层从左到右填充。
- 堆序性质:对于每个节点,其值都满足最大堆或最小堆的条件。
3. 堆的基本操作
- 插入:将新元素添加到数组的末尾,然后上浮(Heapify)以保持堆的性质。
- 删除:删除堆顶元素(最大或最小元素),然后将最后一个元素移到堆顶,并进行下沉操作以保持堆的性质。
4. 堆排序算法
- 堆排序是一种基于堆的数据结构进行的排序算法。
- 首先,构建一个最大堆(或最小堆)。
- 然后,交换堆顶元素和最后一个元素,删除堆顶元素,并调整剩余元素以恢复堆的性质。
- 重复上述步骤,直到堆为空。
代码实现:
堆的基本操作(Python代码)
python复制代码
def heapify(arr, n, i, is_max_heap=True):
largest = i # Initialize largest as root
left = 2 * i + 1
right = 2 * i + 2
# If left child is larger than root
if left < n and (is_max_heap and arr[i] < arr[left] or not is_max_heap and arr[i] > arr[left]):
largest = left
# If right child is larger than largest so far
if right < n and (is_max_heap and arr[largest] < arr[right] or not is_max_heap and arr[largest] > arr[right]):
largest = right
# If largest is not root
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i] # swap
# Heapify the root.
heapify(arr, n, largest, is_max_heap)
def heap_sort(arr, is_max_heap=True):
n = len(arr)
# Build a maxheap.
for i in range(n, -1, -1):
heapify(arr, n, i, is_max_heap)
# One by one extract elements
for i in range(n-1, 0, -1):
arr[i], arr[0] = arr[0], arr[i] # swap
heapify(arr, i, 0, is_max_heap)
# Example usage:
arr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("Sorted array is", arr)
学习心得:
- 堆排序是一种高效的排序算法,其时间复杂度为O(nlogn)。
- 通过今天的学习,我掌握了堆的基本概念和性质,并成功实现了堆排序算法。
- 堆在实际应用中也有很多用途,比如优先级队列、Dijkstra算法等。
接下来的学习计划:
- 深入学习堆的应用场景,如优先级队列的实现。
- 学习其他排序算法,如归并排序、快速排序等。
- 开始学习图论相关知识,如图的表示、遍历等。