堆排序(C语言实现)迭代

  • 首先分清二叉树和堆的区别

堆 可以被定义为一棵二叉树,树的节点中包含键(每个节点一个键),并且满足下面两个条件:
(1)树的形状:简称为完全二叉树,这意味着,树的每一层都是满的,除了最后一层最右边的元素可能缺位。
(2)父母优势:堆特性(heap property)每一个节点的键值都要大于或者等于它子女的键(对于任何叶子我们认为这个条件都是自动满足的)

只存在一棵N个节点的完全二叉树。它的高度等于(log2n)向下取整
堆的根总是包含了堆的最大元素


用数组来实现堆,其中:父母节点的键将会位于数组的前(n/2)向下取整位置中,而叶子的节点的键将会占据后n/2向上取整的位置中
在数组中,对于一个位于父母位置i的键来说,它的子女将会位于2i和2i+1中的元素,相反则是i位置的键来说,父母会位于i/2向下取整


在堆排序中最核心的步骤则是“堆化”
有两种方法:自底向上堆构造,在初始化一棵包含N个节点的完全二叉树时,按照给定的顺序来放置键,从最后的父母节点开始,到根为止,该算法检查这些节点的键是否满足父母优势要求。如果该节点不满足,该算法把节点的键K和它子女的最大键进行交换,然后再检查在新位置上,K是不是满足父母优势要求,这个过程一直继续到对K的

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值