python实现堆排序

堆排序 基本思想:
首先将待排序的记录序列构造成一个堆,此时,选出堆中的最大者即堆顶元素,然后将堆顶记录移除走,并且将剩余的记录再调整成堆,这样又找出了一个次大的元素,以此类推,直到堆中只有一个记录为止。

时间复杂度:O(nlog2n), 这是最好,最坏和平均情况
空间复杂度:O(1)

适用场景:
待排序的数据量比较大时

代码实现:
思路:
先构建一个最大堆, 然后再从这个最大堆中依次取出最大的那个元素,如果是想升序的话,就把最大的元素都取出来,然后逆序一下即可,如果想降序的话直接就是依次取出来的最大的元素。
代码:
在这里插入图片描述

在这里插入图片描述
这个是构建堆的代码

然后堆排序的实现是:

在这里插入图片描述
根节点:i
左孩子:2i
右孩子:2
i+1
在这里解释一下shifUp和shifDown,
shifUp:传入一个待调整元素的下标, 如果这个下标必须大于1,因为下标为0这个元素不是根节点,下标为零这个元素只是我为了方便计算起见设置的一个没有用的节点而已。如果根节点小于待插入节点,那么他们之间交换, 并且更新一下下标,这个为什么要更新一下下标呢??,这个你需要代入几个数字进去计算一下就知道了
shifDown:首先判断根节点的左孩子存在否,在判断一下右孩子存在否,比较左右孩子节点,看看到底哪个节点比较大,记录最大的那个节点的下标,然后和新来的根节点比较,看看新来的是不是最大的,如果不是,还需要继续比较,直到为这个新来的元素找到存在的位置才行,最后要更新一下下标,因为比较会进行交换,位置就会变动。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值