python实现堆排序
场景中,只需要取数据集中最大/最小元素,就用到了堆
堆的概念:
堆是一种特别的二叉树,满足以下两点的二叉树称为堆。
- 完全二叉树
- 每个节点的值都大于等于或小于等于其子节点的值
特点
- 插入、删除的时间复杂度为O(logN)
- 获取最大/最小值的时间复杂度为O(1)
分类:最大堆、最小堆
最大堆
每个节点的值 大于等于 子节点的值
堆顶节点(根节点)是堆中最大值
最小堆
每个节点的值 小于等于 子节点的值
堆顶节点(根节点)是堆中最小值
python实现堆
给一个无序数组,利用堆排序
实现步骤:
- 构造初始堆
- 将堆顶元素与末尾元素交换,使末尾元素最大。继续调整堆,将堆顶元素与末尾元素交换,得到第二大元素
- 重新调整结构,
def heapify(arr, root, end):
while:
child = 2 * root + 1
if child > end:
break
if (child + 1 <= end) and (arr[child + 1] > arr[child]):
child += 1
if arr[child] > arr[root]:
arr[child], arr[root] = arr[root], arr[child]
else:
break
def heap_sort(arr):
n = len(arr)
# 构建一个最大堆
for i in range(n//2-1, -1, -1):
heapify(arr, i, n-1)
for end in range(n-1, 0, -i):
arr[0], arr[end] = arr[end], arr[0]
build(arr, 0, end-1)