堆以及堆排序的优化

1 篇文章 0 订阅

什么是堆?

堆结构+偏序关系

任何关于堆的算法都要先保证其一,再尽力做好另一个

FixHeap()

先保证堆结构不被破坏,即将最后一个放在第一个的位置,然后再利用左右子树只需修一个树的局部完整性达到log(n)的效果

CreateHeap()

对左右子树递归的执行算法,然后fix头部即可, w ( n ) = 2 w ( n / 2 ) + l o g n w(n)=2w(n/2)+logn w(n)=2w(n/2)+logn

堆排序的优化

针对FixHeap进行优化:

在FixHeap()的时候,需要确认三者的大小关系,这使我们的复杂度达到了 O ( 2 n l o g n ) \Omicron(2nlogn) O(2nlogn),为使得系数降低,关键就在于我们以什么手法找到顶部元素该有的位置:

FixHeap(int root,int h)
1. 若正在向下FIX,则将root与其两子最小的一个交换,更新root,并迭代的做h/2(若无子则进入第三步)
2. 若正在向上Fix且比其父大(比其父小则算法终止,FIX完成),则将root与其父交换,更新root,并迭代的做h/2次(若到了此步,算法一定会在此步的过程中终止)
3. if root比其父小,向上FixHeap(root,h)
4. else if root不是它与两子中最小的(无子则终止),则更新h=h/2+1,向下FixHeap(root,h)
5. else 算法终止,FIX完成

堆的泛化

多叉树:使得下沉变得困难,而上浮变得容易,此时就需要调整h/k 的k的大小使之高效

堆的性质

  1. 堆的第k大数在前K层
  2. ∑ h ≤ h − 1 \sum_{h}\le h-1 hh1
  3. 若从1开始计数
    1. 左孩子: 2 i 2i 2i,右孩子 2 I + 1 2I+1 2I+1
    2. 父: i / 2 i/2 i/2
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值