📅  最后修改于: 2023-12-03 15:11:16.446000             🧑  作者: Mango
堆排序(Heap Sort)是一种选择排序,它的最差时间复杂度为 $O(n \log n)$,且它是不稳定的排序方法。堆排序常常被应用在实时数据处理的场合。
我们首先要了解堆这一数据结构。堆是一种经过排序的完全二叉树,其中任一非叶子节点的值都不大于或不小于其左右孩子节点的值,称为大根堆或小根堆。
这里写一个使用 Python 实现的堆排序程序。我们先实现一个最大堆,然后在此基础上进行排序。
def heapify(arr, n, i):
"""从上往下调整为最大堆"""
l = 2 * i + 1
r = 2 * i + 2
largest = i
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 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)
return arr
堆排序的实现可以分为两个步骤:
在上述代码中,我们首先实现了一个 heapify
函数。它的作用是从上往下调整堆,使得以当前节点为根节点的子树重新成为一个最大堆。
我们还实现了一个 heap_sort
函数,它执行了上述两个步骤。在第一个步骤中,我们从最后一个非叶子节点向上遍历,每个节点都调用了 heapify
函数。这样就得到了一个最大堆。
在第二个步骤中,我们从堆中依次取出最大值(即堆顶元素)并放到数组末尾。然后重新调用 heapify
函数,重新调整堆。这样就实现了堆排序。
我们来看一个使用示例:
arr = [4, 10, 3, 5, 1]
print(heap_sort(arr)) # 输出 [1, 3, 4, 5, 10]
这里我们先初始化了一个数组 arr
,包含了五个无序的整数。然后调用我们实现的 heap_sort
函数,得到了一个排序后的数组 [1, 3, 4, 5, 10]
。
堆排序是一种高效的排序算法,适用于实时数据处理的场合。在Python中,我们可以使用递归方式来实现堆排序。代码比较简洁易懂,在实际应用中也比较常见。