Python实现经典排序算法-堆排序

本文介绍了堆排序算法,详细讲解了堆排序的原理、二叉树遍历、堆的性质,以及大顶堆和小顶堆的概念。通过Python代码展示了如何构建和调整堆,最后讨论了堆排序的时间复杂度和空间复杂度。
摘要由CSDN通过智能技术生成

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。

堆是一种类似于完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或者索引总是大于(小于)它的父节点。

二叉树的遍历

树的遍历:对树中所有元素不重复的访问一遍,也称作扫描。
遍历树的方式:

  • 广度优先遍历
    • 层序遍历
  • 深度优先遍历
    • 前序遍历
    • 中序遍历
    • 后序遍历

堆排序

  • 堆是一个完全二叉树
  • 每个非叶子结点都要大于或者等于其左右孩子结点的值的堆称为大顶堆
  • 每个非叶子结点都要小于或者等于其左右孩子结点的值的堆称为小顶堆
  • 根节点一定是大顶堆的最大值或者小顶堆的最小值

大顶堆

堆排序的实现:

堆排序可以按以下步骤来完成:

1.先构建大顶堆

为了更直观的看到大顶堆的实现过程,我们可以实现将一个数组先打印成一个二叉树的格式

def print_tree(src):
    length = len(src)
    k = math.ceil(math.log2(length+1))
    index = 1
    max_width = 2 * length
    for i in range(k): # 0,1,2
        for j in range(2**i):
            print("{:^{}}".format(src[index],max_width),end = " ")
            index += 1
            if index >= length:
                break
        max_width = max_width // 2
        print( )
        
src = [0,9,8,7,6,5,4,3,2,1]
print_tree(src)

         9           
    8          7      
  6     5     4     3   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值