####为了不失一般性,本文采用的是d叉堆实现。
代码如下:
# -*- coding:utf-8 -*-
# 此时假设的的 d = 4
def ListMax(s):
'''返回列表s中的最大值的下标'''
max = 0
for i in range(1,len(s)):
if s[i] > s[max]:
max = i
return max
def BuildHeap4(li,d):
'''建堆函数'''
i = len(li) - 1
while i>=0:
MaxHeapify(li,i,d)
i -= 1
def MaxHeapify(li, i, d):
'''本函数的功能是在数组li中,使下标为i对应的值遵循最大堆的性质
即它的子女必须小于等于它,以此类推,直到这个值满足条件或者它在
叶子节点上'''
s = []
largest = i
for j in range(1,d+1):
if (d*i + j) > len(li)-1:
break
s.append(li[d*i + j])
if s == []:
return
else:
max = ListMax(s)
if li[d*i+max+1] > li[largest]:
largest = d*i + max +1
if largest != i:
li[largest],li[i] = li[i],li[largest]
MaxHeapify(li, largest, d)
def ExtractMax(li, d):
'''去掉最大堆中的最大值,并返回'''
max = li[0]
li[0] = li[-1]
li.pop()
MaxHeapify(li, 0, d)
return max
def Increase(li,i,key,d):
'''更新某个节点的值,并使它满足最大堆的性质'''
li[i] = key
while i > 0 and li[i] > li[(i-1)/d]:
li[i],li[(i-1)/d] = li[(i-1)/d],li[i]
i = (i - 1)/d
def Insert(li, key,d):
'''插入一个节点,并使它满足最大堆的性质'''
li.append(key)
Increase(li,len(li)-1,key,d)
if __name__ == '__main__':
li = [7,2,9,2,1,1,2,3,4,3,8,2]
BuildHeap4(li,4)
print li
print ExtractMax(li,4)
print li
Insert(li,10,4)
print li