Python代码实现堆排序

本文详细介绍了堆排序算法的实现过程,包括如何通过向下调整将根节点的左右子树转换为堆,以及完整的堆排序步骤。文章提供了Python代码示例,展示了如何通过建堆和逐个出数的过程完成排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

# 堆的向下调整性质
# 当根节点的左右子树都是堆时,可以通过一次向下的调整来将其变换成一个堆
def sift(li, low, high):  # low是根节点所在位置的下标,high是要调整的树的最后一个元素的下标(用于判断是否结束调整)
    tmp = li[low]  # 根节点的值存起来
    i = low  # 根节点下标
    j = 2 * i + 1  # 根节点左孩子下标
    while j <= high:  # 判断j是否存在,不存在说明可以结束调整了
        if j + 1 <= high and li[j+1] > li[j]:  # 如果右孩子存在并且比左孩子大
            j += 1  # j指向右孩子
        if li[j] > tmp:  # 如果孩子的值比父亲的大,需要进行调整,否则可以结束调整
            li[i] = li[j]
            i = j
            j = 2 * i + 1
        else:
            break
    li[i] = tmp  # 调整结束,将tmp的值放到调整后的位置


def heap_sort(li):
    # 1. 建堆
    n = len(li)
    for i in range(n//2-1, -1, -1):  # i表示遍历的low, n//2-1是最后一个非叶子节点的下标
        sift(li, i, n-1)
    # 2. 挨个出数
    for i in range(n-1, 0, -1):  # i表示逻辑上当前堆的high
        li[i], li[0] = li[0], li[i]
        sift(li, 0, i-1)
  # 最后在出数的时候为了节省空间,我们把出的数放在队尾,i前面的是逻辑上的堆,后面是有序区

 

转载于:https://www.cnblogs.com/IronDukeLinux/p/10728513.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值