# 최소힙구현classBinaryHeap:def__init__(self):self.items=[None]def__len__(self):returnlen(self.items)-1# 삽입 : O(logn)# 반복 구조def_percolate_up(self):# 배열 가장 마지막에 먼저 삽입i=len(self)parent=i//2# 부모가 더 큰 값을 가지는 경우 스왑whileparent>0:ifself.items[i]<self.items[parent]:self.items[parent],self.itmes[i]= \
self.items[i],self.items[parent]i=parentparent=i//2definsert(self,k):self.items.append(k)self._percolate_up()# 추출 : O(logn)# 재귀 구조def_percolate_down(self,idx):left=idx*2right=idx*2+1smallest=idxifleft<=len(self)andself.items[left]<self.items[smallest]:smallest=leftifright<=len(self)andself.items[right]<self.items[smallest]:smallest=rightifsmallest!=idx:self.items[idx],self.items[smallest]= \
self.items[smallest],self.items[idx]self._percolate_down(smallest)defextract(self):extracted=self.items[1]self.items[1]=self.items[len(self)]self.items.pop()self._percolate_down(1)returnextracted