堆排序算法之python3实现

"""
堆排序
"""


# 向下调整的函数,传入的数据为堆,堆顶节点的编号和堆末尾的界限值
def Heapify(heap, start, end):
    father = start
    son = father * 2 # son存储较大的子节点的编号,初始化为左子节点
    while end >= son: # 当目前数据所处的节点还有子节点时,继续循环调整
        # 存在子节点且左右节点进行比较
        if end >= son + 1 and heap[son + 1] > heap[son]:
            # 如果存在右节点且其值大于左子节点的值,son存储右子节点的编号
            son += 1
        if heap[son] > heap[father]: # 如果子节点值大于父节点值
            # 进行值的交换
            heap[father], heap[son] = heap[son], heap[father]
            # 继续进行下一层调整
            father = son
            son = father * 2
        else:
            # 如果所有父节点大于等于子节点,则交换完成
            return


def HeapSort(heap):
    # 初始化最大顶函数
    heap.insert(0, 0)
    # 堆顶编号从0开始,在位置0处插入一个数使得堆中元素的编号与在数组中的下标一样
    for i in range(len(heap) - 1 // 2, 0, -1):# 从最底层最右侧的非叶子节点开始调整
        Heapify(heap, i, len(heap) - 1)
    # 从堆末尾开始进行元素交换
    for i in range(len(heap) - 1, 0, -1):
        heap[1], heap[i] = heap[i], heap[1]
        Heapify(heap, 1, i-1)
    return heap


if __name__ == '__main__':
    test_list = [11, 6743, 4656, 2321, 12, 54, 876, 232]
    print(HeapInit(test_list))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值