class MaxHeap:
def __init__(self,arr):
if isinstance(arr,Array): #heapify,比新建一个新数组插入到空堆中复杂度要好
self.__data=arr
for i in range(self._parent(len(arr)-1),-1,-1):
self._shift_down(i)
return
self.__data=[]
def _parent(self,index):
if index==0:
raise ValueError('Error')
return (index-1)//2
def _left_child(self,index):
return index*2+1
def _right_child(self,index):
return index*2+2
def add(self,e):
self.__data.append(e)
self.__shift_up(len(self.__data)-1)
def __shift_up(self,k):
while k>0 and self.__data[k]>self.__data[self._parent[k]]:
self.__data[k],self.__[self._parent[k]]=self.__[self._parent[k]],self.__data[k]
k=self._parent(k)
def extract_max(self):
if self.__data:
ret=self.__data[0]
(self.__data[0],self.__data[len(self._data)-1]=self.__data[0],
self.__data[len(self.__data)-1])
del self.__data[-1]
self.__shift_down(0)
def __shift_down(self,k):
while self._left_child(k)<len(self._data):
j=self._left_child(k)
if j+1 <len(self._data) and self._data[j+1]>self._data[j]:
j+=1
if self.__data[k]>self.__data[j]:
break
self.__data[k],self.__data[j]=self.__data[j],self.__data[k]
k=j