def left(i):
return i*2 + 1
def right(i):
return i*2 + 2
def parent(i):
return (i-1) / 2
def max_heapify(A, i):
l = left(i);
r = right(i);
if l < len(A) and A[l] > A[i]:
largest = l
else:
largest = i
if r < len(A) and A[r] > A[largest]:
largest = r
if largest != i:
temp = A[i]
A[i] = A[largest]
A[largest] = temp
max_heapify(A, largest)
def build_max_heap(A):
for i in range((len(A)+1) / 2, -1, -1):
max_heapify(A, i);
def maximum(s):
return s[0];
def increase_key(s, i, k):
if s[i] < k :
s[i] = k
p = i
c = i
while c != 0:
p = parent(i)
if s[p] >= s[c]:
return
else:
tmp = s[c]
s[c] = s[p]
s[p] = tmp
c = p
p = parent(p)
def insert(s, x):
s.append(x-1)
increase_key(s, len(s) - 1, x)
def extract_max(s):
m = s[0]
s[0] = s[len(s) -1]
s.pop()
max_heapify(A,0)
if __name__ == "__main__":
l = [2,3,7,6,3,5, 100, 300, 400,20];
build_max_heap(l);
print l
print "maximum l is :", maximum(l)
insert(l, 212)
print "after insert 212 :", l