选择排序之堆排序

堆排序,在排列的过程中将元素看成完全二叉树的结构,利用双亲结点和子节点之间的关系,找出最大(或小)的元素。

双亲结点为Ri,则其左孩子和右孩子分别为R2i,R(2i+1),利用这一点关系,通过构造堆的方法排序。

假设我们要输出从小到大的排列,那么可以构造大根堆,即寻找堆的最大元素,上浮到根节点(还有就是保证双亲结点大于孩子节点),再将跟点与最后一个叶子结点交换,接着去除最后一个叶子结点,堆剩下的堆重新筛选,找出最大元素,上浮到根节点,与最后一个叶子结点交换......一直循环到堆只剩下一个结点。如何构造和筛选大根堆?

选择最后一个双亲结点位置(i=len/2),让孩子结点中的最大者与双亲结点进行比较(即R[2i]和R[2i+1]中的最大者与R[i]比较),如果孩子结点大,则相互交换位置,接着选择上一个双亲结点,继续进行比较,一直循环知道第一个双亲结点的比较完成。

而比较过程中会进行筛选,即当出现了交换位置的情况,那个被交换位置的那个孩子结点要和它的孩子结点再进行比较,这样才能确保所有的双亲结点都大于它的孩子结点。

代码如下:

2011-02-14 UNIX环境

   

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值