前言
在上算法课的时候,突然老师给了这个题目,然后去网上搜索,找到的都是用迭代法建立最大堆的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)
总结
分治法的思想其实并不难即:分割,解决,合并。
但是要完全掌握却不是一件简单的事情,还需要继
续加油和努力!!!!