CLRS 6.2维护堆的性质

6.2-1
操作过程如下图:
这里写图片描述

6.2-2

MIN-HEAPIFY(A, i)
  l = LEFT(i)
  r = RIGHT(i)
  if l ≤ A.heap-size and A[l] < A[i]
      smallest = l
  else smallest = i
  if r ≤ A.heap-size and A[r] < A[i]
      smallest = r
  if smallest ≠ i
      exchange A[i] with A[smallest]
      MIN-HEAPIFY(A, smallest)

运行时间和MAX_HEAPIFY一样。

6.2-3
没有什么效果。

6.2-4
没什么结果。

6.2-5
伪代码略,贴出实际代码如下:

#define LEFT(i) (2 * i + 1)
#define RIGHT(i) (2 * i + 2)

void MAX_HEAPIFY(int *array,int i,int heapSize)    //第一个元素下标从0开始
 {
    int largest;
    while(1)
    {
        if(LEFT(i) < heapSize && *(array + LEFT(i)) > *(array + i))
            largest = LEFT(i);
        else largest = i;
        if(RIGHT(i) < heapSize && *(array + RIGHT(i)) > *(array + largest))
            largest = RIGHT(i);
        if(largest != i)
        {
            int temp = *(array + i);
            *(array + i) = *(array + largest);
            *(array + largest) = temp;
            i = largest;
        }
        else return;
    }
 }

6.2-6
最坏情况是从根结点开始调用MAX_HEAPIFY,然后根结点的孩子结点继续调用MAX_HEAPIFY,每层调用一次MAX_HEAPIFY直至叶子结点,运行时间为 Ω(lgn)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值