python实现堆排序

参考:
https://blog.csdn.net/weixin_42109012/article/details/91668543
https://blog.csdn.net/sunxianghuang/article/details/51872360

堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]]>=A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求而知,最大的值一定在堆顶。最小堆通常在构造优先队列时使用。
在这里插入图片描述
堆排序
基本思想:
首先通过自底向上的调整堆来建立大根树,然后依次将最大值a[0]与末尾元素交换并调整交换后的堆(大小减1)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码:

def down(s, node, end):  # s是列表,node是父节点,end是列表长度
    """从上面到下面判断是否符合大顶堆,不符合就交换"""
    root = node  # 父节点
    child = 2 * root + 1  # 子节点
    while child < end:
        if s[child] < s[child + 1] and (child + 1) < end:  # 找出较大的子节点
            child += 1
        if s[child] > s[root]:  # 如果子节点大于父节点,交换
            s[child], s[root] = s[root], s[child]
            root = child
        child = child * 2 + 1


def BuildHeap(s, size):
    """从倒数第二排的非叶子节点开始创建大顶堆"""
    for i in range(size // 2 - 1, -1, -1):
        down(s, i, size)


def HeapSort(s, size):
    BuildHeap(s, size)
    for i in range(size - 1, 0, -1):
        s[0], s[i] = s[i], s[0]
        down(s, 0, i)


s1 = [49, 38, 65, 97, 76, 13, 27, 49, 10]
print(f'排序前:{s1}')
size1 = len(s1)
HeapSort(s1, size1)
print(f'排序后:{s1}')

结果
在这里插入图片描述
算法复杂度
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值