分治法------建立最大堆(递归)


前言

在上算法课的时候,突然老师给了这个题目,然后去网上搜索,找到的都是用迭代法建立最大堆的code,经过思考、老师的讲解get了递归形式的建立最大堆的算法,既是记笔记,也为了方便后来者…


一、维护最大堆的算法

伪代码:

MAX-HEAPIFY(A,i)
l ← LEFT(i)//将下标为i的结点的左结点赋给变量l
r ← RIGHT(i)//将下标为i的结点的右结点赋给变量r
If l ≤ heap-size[A] and A[l] > A[i]//检查l的合法性,如果左结点包含的值大于根结点,则将变量target变成左结点的下标
    then largest ← l
    else largest ← i
If r ≤ heap-size[A] and A[r] > A[largest]//同理,比较右结点和根结点
    then largest ← r
  If largest ≠ i//如果左结点或右结点有大于根结点的则交换值
        then exchange A[i]↔A[largest]
                  MAX-HEAPIFY(A, largest)//递归进行整体的更新

时间复杂度T(n)=O(lg(n))
后续再贴图和代码!

二、创建最大堆(非递归)

BUILD-MAX-HEAP(A)
	heap-size[A] <- length[A]
	for i <- (length[A]/2) downto 1//从下标length(A)/2开始,就是从倒数第二层(第一层非叶子结点)开始从下往上建立最大堆
		do MAX-HEAPIFY(A,i)

三、创建最大堆(递归)

public static void MaxHeapBuild(int array[],int index){
int left = Left(index);
int right = Right(index);
if(left>heapSize && right>heapSize)//叶子结点不需要建堆
      return;
if(left <= heapSize)//判断左结点合法性,同时使得左子树建成最大堆
        MaxHeapBuild(array,left);
if(right<=heapSize)//判断右结点合法性,同时使得右子树建成最大堆
        MaxHeapBuild(array,right);
MAX-HEAPIFY(array,index);//在左右子树均为最大堆的前提下增加一个根结点,并使整个结构成为最大堆
}

时间复杂度T(n)=O(n)

总结

分治法的思想其实并不难即:分割,解决,合并。
但是要完全掌握却不是一件简单的事情,还需要继
续加油和努力!!!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值