📜  堆排序 python (1)

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

堆排序 Python

堆排序(Heap Sort)是一种基于比较的排序算法,它的时间复杂度为 O(n log n)。堆排序首先将待排序序列构建成一个堆,然后进行排序,这里的排序指的是将堆顶元素与堆末尾元素交换,然后让堆尺寸减 1 并继续维护堆结构,直到堆尺寸为 1。

算法流程
  1. 将待排序序列构建成一个堆 H[0……n-1]。
  2. 利用堆的性质,找到堆顶元素(最大值或最小值),并与堆末尾元素交换,此时堆的尺寸减 1。
  3. 维护堆结构,重新构建堆。
  4. 重复步骤 2 和 3,直到堆的尺寸为 1。
代码实现
def heapify(lst, n, i):
    largest = i  # 最大值节点
    l = 2 * i + 1  # 左节点
    r = 2 * i + 2  # 右节点

    # 判断左节点是否大于根节点
    if l < n and lst[i] < lst[l]:
        largest = l

    # 判断右节点是否大于根节点
    if r < n and lst[largest] < lst[r]:
        largest = r

    # 如果最大值节点不是根节点,则交换根节点和最大值节点
    if largest != i:
        lst[i], lst[largest] = lst[largest], lst[i]

        # 继续递归处理最大值节点
        heapify(lst, n, largest)


def heap_sort(lst):
    n = len(lst)

    # 构建一个大根堆
    for i in range(n // 2 - 1, -1, -1):
        heapify(lst, n, i)

    # 一个一个交换堆顶元素与堆末尾元素并重建堆
    for i in range(n - 1, 0, -1):
        lst[0], lst[i] = lst[i], lst[0]
        heapify(lst, i, 0)

    return lst

使用方法
lst = [4, 10, 3, 5, 1, 6, 2, 8, 7, 9]
sorted_lst = heap_sort(lst)
print(sorted_lst)

输出结果为:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]