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