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

如何使用Python实现堆排序函数

发布时间:2023-07-23 09:59:48

堆排序是一种排序算法,通过构建最大堆(或最小堆)来实现排序。下面是使用Python实现堆排序函数的示例代码:

def heapify(arr, n, i):
    largest = i      # 将最大元素的索引初始化为根节点
    left = 2 * i + 1 # 左子节点的索引
    right = 2 * i + 2 # 右子节点的索引
 
    # 如果左子节点存在且大于根节点,则将最大元素的索引更新为左子节点
    if left < n and arr[i] < arr[left]:
        largest = left
 
    # 如果右子节点存在且大于根节点和左子节点,则将最大元素的索引更新为右子节点
    if right < n and arr[largest] < arr[right]:
        largest = right
 
    # 如果最大元素的索引不是根节点的索引,则交换它们,并递归对被交换的子节点进行堆化
    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)  # 对剩余的元素重新进行堆化
 
# 测试
arr = [12, 11, 13, 5, 6, 7]
heapSort(arr)
print("排序后的数组为:")
for i in range(len(arr)):
    print("%d" % arr[i])

上述代码中的heapify函数用于将以特定节点为根的子树(二叉树)堆化,heapSort函数用于实现堆排序的主要逻辑。堆排序过程分为两个步骤:

1. 初始时,先构建最大堆,然后将最大的元素(堆顶元素)与当前未排序部分的最后一个元素交换,并重新堆化剩余的元素,即将次大的元素放到倒数第二个位置。

2. 重复上述过程,直到堆为空,最后得到的数组为有序的。

通过上述实现,我们可以使用Python实现堆排序函数。这种算法的时间复杂度为O(nlogn),空间复杂度为O(1)。