(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的每一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。
树的根结点:A[0]。给定一个下标i,很容易得到它的父结点、左孩子和右孩子的下标。
import math
class heapsort:
def __init__(self,a_A):
self.list=a_A
def parent(self,i):
return math.floor((i-1)/2)
def left(self,i):
return 2*i+1
def right(self,i):
return 2*i+2
运行:
>>> A=[16,14,10,8,7,9,3,2,4,1]
>>> p=heapsort(A)
>>> p.left(1)
3
>>> p.right(1)
4
>>>
最大堆:
最大堆性质是指除了根以外的所有结点i都要满足:
A[parent(i)]>=A[i]
最小堆:
最小堆性质是指除了根结点以外的所有结点i都有:
A[parent(i)]<=A[i]
最小堆中的最小元素存放在根结点中。
我们定义一个堆中的结点的高度就为该结点到叶结点最长简单路径上边的数目。进而我们可以把堆的高度定义为根结点的高度。
既然一个包含n个元素的堆可以看做一棵完全二叉树,那么堆的高度是下取整lgn。
堆结构上的一些基本操作的运行时间至多与树的高度成正比,即时间复杂度为O(lgn)