欢迎访问宙启技术站
智能推送

Python如何实现堆排序算法?

发布时间:2023-06-06 00:32:40

堆排序是一种基于堆的比较排序算法,常用于数字排列,实现不依赖于数组的选择与逐步调整,时间复杂度为 $O(n \log n)$,是一种不稳定的排序方法。

堆排序的主要思路是将待排序数列转化为堆,然后不断将最大值(最小值)取出并调整堆,直到整个序列有序。因为堆本身就是一棵完全二叉树,在 Python 中我们可以使用数组或者列表来实现。

具体实现思路如下:

1.将无序数列构建成大根堆。即对于每个节点,其值都大于其子节点。

2.把堆顶元素(最大值)取出,将堆底元素放到堆顶,然后将其与其子节点比较,不断向下调整,使得堆重新形成。

3.重复步骤2,直到堆的大小为1。

在 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 heapSort(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)  # 重新建堆,向下调整

    return arr

首先是建堆部分,使用递归的方式对每个节点进行比较和调整,确保每个节点都满足堆的性质。然后在排序部分,针对每次建好的堆,取出堆顶元素,放到堆底,继续调整堆,直到堆大小为1。

在主函数中,只需要传入一个待排序数组即可使用堆排序算法对其进行排序:

arr = [5, 2, 8, 4, 9, 3, 6, 1, 7]
sorted_arr = heapSort(arr)
print(sorted_arr)

输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]。

这就是 Python 实现堆排序算法的基本思路和代码实现。虽然堆排序的时间复杂度相对其他排序算法来说更优,但也并不适合所有排序问题。在实际使用时,需要综合考虑问题本身的特点和数据量等因素,选择合适的排序算法。