堆排序详解【java版附流程图】

堆排序详解——java版

         近期一直再看别人的源码,无意中发现了他里面使用了堆排序算法,由于以前对于堆的排序问题都只是听过,而没有真正的理解过它和实践过它。于是也借本次机会了解了一下堆排序的算法。其实堆的排序是通过二叉树的形式对元素进行排序,它的规律是:ki>=k2i并且ki>=k2i+1或者是ki<=k2i并且ki<=k2i+1,意思就是它的父节点一定大于(小于)它的两个孩子们他们节点,也可以叫大堆排序(小堆排序)下面给出它们的存储结构图:

       上面的图是我从百度百科里面截过来的。堆排序是通过数组的形式存储二叉树的信息,那么它就需要计算一个节点的父节点位置,和一个节点的左孩子和右孩子节点的位置,其公式分别为:父=((i+1)/2)-1 左=(2*(i+1))-1 右=2*(i+1)。可以通过以上几个公式计算节点的父节点和孩子节点存储在数组是的位置。所以当向堆中添加元素的时候,将堆的大小添加1,用于存储新添加进来的元素,添加元素的初始存储位置是堆尾(注意此时还未将元素添加到堆中,只是表示在当前堆大小加一的位置将要存放新添加进来的元素)。先找到插入元素存放的位置,也就是将插入的元素和当前堆中最后元素的父节点进行比较,如果比该父节点好,则将父节点移动到移动到插入元素初始存储的位置,而新添加元素此时的存储位置是刚才父节点的存储位置,将继续和父节点的父节点进行比较,重复上面的操作,就是调换新添加的存储位置和当前比较的父节点的位置,直到遇到一个父节点比它好或者是到了堆的顶部则停止寻找。这样会导致一个为题,就是假设新添加的元素不是插在堆的尾部,那么将会导致在插入新元素之后的元素就失去了堆排序的特性,就是父节点比孩子节点大(小),所以此时将还要使用一个heapify(i),方法来进行对插入新元素位置以后的元素进行重新进行堆排序。详细的思路可见代码。以下粘贴处我用java实现的堆排序代码:

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值