📜  用于堆排序的Python程序(1)

📅  最后修改于: 2023-12-03 15:11:16.446000             🧑  作者: Mango

用于堆排序的Python程序

堆排序(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
代码解释

堆排序的实现可以分为两个步骤:

  1. 把数组构建成一个最大堆。
  2. 从堆中依次取出最大值并放到数组末尾。

在上述代码中,我们首先实现了一个 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中,我们可以使用递归方式来实现堆排序。代码比较简洁易懂,在实际应用中也比较常见。