📜  堆排序(1)

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

堆排序

堆排序是一种基于堆数据结构的排序算法。堆是一个完全二叉树,并且具有以下两个性质:

  1. 堆中每个节点的值都大于等于(或小于等于)其子节点的值,根节点的值即为堆中的最大值(或最小值)。
  2. 堆中每个父节点的值都大于等于(或小于等于)其子节点的值。

堆排序的基本思想是,将待排序序列构建成一个大顶堆(或小顶堆),然后依次将堆顶元素与最后一个元素交换,并对剩余元素重新构建堆,再重复这个过程,直到整个序列有序。

算法步骤
  1. 构建堆:将待排序序列构建成一个堆,可以使用自底向上的方式来构建堆,先从最后一个非叶子节点开始,依次向前调整,使得每个子树都满足堆的性质,这样就构建了一个大顶堆(或小顶堆)。
  2. 排序:交换堆顶元素与最后一个元素,然后将剩余元素重新构建堆。重复这个过程,直到整个序列有序。
代码实现

下面是使用Python语言实现堆排序的示例代码:

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 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[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
复杂度分析

堆排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。堆排序是一种不稳定的排序算法,因为在堆的构建过程中,相等元素的相对顺序可能发生改变。堆排序的空间复杂度为O(1),它是原地排序算法。

总结

堆排序是一种高效的排序算法,它利用堆的性质来进行排序。相比于其他排序算法,堆排序具有较好的时间复杂度和空间复杂度,在实际应用中得到广泛的应用。如果需要对大量数据进行排序,堆排序是一个值得考虑的选择。