堆排序

堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。

既然是堆排序,自然需要先建立一个堆,而建堆的核心内容是调整堆,使二叉树满足堆的定义(每个节点的值都不大于其父节点的值)。调堆的过程应该从最后一个非叶子节点开始,假设有数组a[] ={16,7,3,20,17,8}。那么调堆的过程如下图,数组下标从0开始,a[2] = 8开始。分别与左孩子和右孩子比较大小,如果a[2]最大,则不用调整,否则和孩子中的值最大的一个交换位置。


以上便是建堆的完整过程,主要总结有以下几点需要注意:

1.首先将所有元素按照初始顺序逐层填充到一个完全二叉树中

2.从“最后一个非终端节点”开始,调用MAX-HEAPIFY方法,调整堆的结构,直到根节点为止


接下来通过最大堆将输入数组排序,最大堆构建完成后我们将堆顶元素和堆的最后一个节点元素交换,这样堆的最后一个节点就是堆的最大值,同时将堆的大小减1,并继续调整二叉树使其满足最大堆的特性。重复此步骤,最后的输入数组就是排序的了。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值