了堆排序算法,包括堆的定义、分类(大根堆与小根堆)、排序思想以及构造堆的过程。通过代码示例展示了如何构建和调整堆,最终得出排序结果。堆排序具有平均时间复杂度O(nlogn)的特点,是一种实用的排序算法。
时间: 2024-09-24 16:19:17 浏览: 48
堆排序是一种基于比较的排序算法,它利用了堆数据结构来进行操作。堆是一种特殊的树形数据结构,每个节点的值都大于或小于其子节点的值,这种特性分为两类:
1. **大根堆(Max Heap)**:也称为父节点大于子节点的堆,每个节点的值都大于或等于其子节点的值。根节点是最大值,通常用于存储待排序序列中的最大元素。
2. **小根堆(Min Heap)**:则相反,每个节点的值都小于或等于其子节点的值,根节点是最小值。在实际应用中,我们更常见的是使用小根堆来实现堆排序,因为可以直接取出最小元素。
堆排序的基本思路是:
- 首先,将待排序的数组构建成一个大根堆(或小根堆),保证堆顶元素是最大(或最小)值。
- 然后,将堆顶的最大(或最小)元素与末尾元素交换位置,此时末尾就得到了当前序列的最大(或最小)值,并移除堆顶。
- 接着,对剩余的元素重新调整成堆,继续上述过程,直到整个序列有序。
以下是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[0], arr[i] = arr[i], arr[0] # 交换
heapify(arr, i, 0)
# 示例
arr = [12, 11, 13, 5, 6, 7]
heap_sort(arr)
print("Sorted array is", arr)
```
阅读全文