目录
一 堆的相关知识
二 堆的伪代码
三 堆的算法性能分析
一 堆的相关知识
1.1 堆的性质
1、下标为i的下标,其父节点为floor(i/2),左子节点下标为2i,其右子节点下标为
2i+1
2、n个元素的堆时,叶节点的下标为
floor(n/2)+1,floor(n/2)+2,······,n;
证明:假设 2k≤n≤2k+1
∴ floor(n/2)+1 = k+1;
∴ 假设 floor(n/2)+1 不是叶节点,则其存在左子节点;
∴ floor(n/2)+1 左子节点的下标为2k+2;
∵ 2k+2>n,大于堆的规模,所以 floor(n/2)+1不可能是父节;
3、n个元素的堆,整个堆的高度为
,
高度h(底层h=0)时最大节点数为
;
1.2 最大堆
二 堆排序伪代码
堆排序主要由
堆维护和
建堆两个关键步骤构成
2.1 堆维护:
2.2 建堆
2.3 堆排序
三 算法性能分析
3.1 堆维护复杂度分析
维护堆步骤是父节点和两个子节点比较后,在调用子树规模的堆维护步骤,且子树的最大规模为2n/3
∴T(n)≤
T(2n/3)+⊙(1)
根据主从定理,b=0,a=2/3,所以
⊙(
)=⊙(1),所以T(n)≤⊙(lgn),即T(n)=O(lgn)
因为规模为n的堆高度h=lg,所T(n)=O(h)
3.2 建堆复杂度分析
建堆就是从下标最大的父节点(最底层的父节点开始)之下二上地执行堆维护,
因为规模为n的堆的高度为
,在高度h是最多含有
个节点
∴建堆的复杂度为
,根据线性性质有:
将x=1/2代入公式
可得
3.2 堆排序复杂度分析
堆排序主要步骤是执行一次建堆和n-1此堆维护
建堆O(n),每次堆维护的复杂度为O(lgn),所以对排序的算法复杂度为T(n)=(n-1)O(lgn)+O(n)=O(nlgn)+O(n)=O(nlgn)