📅  最后修改于: 2023-12-03 15:41:09.569000             🧑  作者: Mango
在本篇文章中,我们将介绍常见的排序算法——堆排序(Heap Sort)。堆排序是一种选择排序,特别之处在于使用了堆这种数据结构。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即父节点的键值总是大于或者等于(小于或等于)任何一个子节点的键值。
堆排序的时间复杂度为 O(n log n)。
堆排序是一种不稳定的排序算法。它的空间复杂度为 O(1)。
堆排序的具体实现分为两个步骤:
下面是具体的算法实现:
def heapify(arr, n, i):
largest = i # 找到最大元素
l = 2 * i + 1 # 左子树
r = 2 * i + 2 # 右子树
# 确保左子树比最大元素大
if l < n and arr[i] < arr[l]:
largest = l
# 确保右子树比最大元素大
if r < n and arr[largest] < arr[r]:
largest = r
# 交换最大元素和根节点
if largest != i:
arr[i],arr[largest] = arr[largest],arr[i]
# 继续堆化修改后的子树
heapify(arr, n, largest)
def heapSort(arr):
n = len(arr)
# 创建最大堆
for i in range(n, -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]
heapSort(arr)
print(arr)
堆排序是一种高效的排序算法,它的时间复杂度为 O(n log n),空间复杂度为 O(1)。但是,堆排序的实现比较复杂,需要掌握堆这种数据结构才能熟练地使用。我们可以在排序数据量比较大的时候选用堆排序算法。