1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class BinaryHeap(): def __init__(self): self.heap_list=[0] self.length=0
def insert(self,i): self.heap_list.append(i) self.length+=1 self.perc_up(self.length)
def perc_up(self,i): while i//2>0: if self.heap_list[i]>self.heap_list[i//2]: self.heap_list[i],self.heap_list[i//2]=self.heap_list[i//2],self.heap_list[i] i>>=1
def max_child(self,i): if i*2+1>self.length: return i*2 else: if self.heap_list[i*2]>self.heap_list[i*2+1]: return i*2 return i*2+1
def del_max(self,i): val=self.heap_list[1] self.heap_list[1]=self.heap_list.pop() self.length-=1 self.perc_down(1) return val
def perc_down(self,i): while i*2<=self.length: idx=self.max_child(i) if self.heap_list[i]<self.heap_list[idx]: self.heap_list[i],self.heap_list[idx]=self.heap_list[idx],self.heap_list[i] i=idx
def build_heap(self,ls): self.length=len(ls) i=self.length//2 self.heap_list=[0]+ls[:] while i>0: self.perc_down(i) i-=1
if __name__=='__main__': ls=[9,5,6,3,2,3,10] heap=BinaryHeap() heap.build_heap(ls) print(heap.heap_list)
|