📜  是一个按最小堆排序的数组 (1)

📅  最后修改于: 2023-12-03 14:55:11.090000             🧑  作者: Mango

是一个按最小堆排序的数组

一个按最小堆排序的数组是一个有序数组,其中每个节点(除根节点外)都满足比它的父节点小,根节点为最小值。

实现

为了实现最小堆排序,我们可以使用数组来表示堆。对于一个索引为 i 的节点,其左节点的索引为 2 * i + 1,右节点的索引为 2 * i + 2,父节点的索引为 (i - 1) / 2。因此,我们可以使用以下代码来实现最小堆排序:

def heapify(arr, n, i):
    smallest = i  # 将最小值设为当前节点
    left = 2 * i + 1
    right = 2 * i + 2

    if left < n and arr[left] < arr[smallest]:
        smallest = left

    if right < n and arr[right] < arr[smallest]:
        smallest = right

    if smallest != i:
        arr[i], arr[smallest] = arr[smallest], arr[i]  # 交换节点
        heapify(arr, n, smallest)  # 递归维护最小堆

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 函数用于维护一个以 i 为根节点的最小堆,heap_sort 函数通过建立最小堆并重复获取最小值和维护最小堆来对输入的数组进行排序。由于建立最小堆和维护最小堆的复杂度都是 $O(\log n)$ 的,因此最小堆排序的时间复杂度是 $O(n \log n)$。

应用

最小堆排序在处理需要快速获取最小值的场景中非常有用。例如,在任务调度中,可以使用最小堆维护所有待执行的任务的优先级,并在每次选择下一个任务时获取优先级最高的任务。此外,最小堆排序还可以用于实现堆栈和优先队列等数据结构。

总结

在本文中,我们介绍了最小堆排序,并提供了一个用 Python 实现的示例程序。我们还讨论了最小堆排序的应用,包括任务调度和数据结构实现。通过了解最小堆排序,程序员可以更好地理解和应用该算法。