root node가 언제나 최대 또는 최소인 완전 이진 트리를 만족하는 자료구조
| 힙 heaps | 이진 탐색 트리 | |
|---|---|---|
| 원소들은 완전히 크기 순으로 정렬되어 있는가 | x | o | 
| 특정 키 값을 가지는 원소를 빠르게 검색할 수 있는가 | x | o | 
| 부가의 제약 조건이 있는가 | 완전 이진트리여야 함 | x | 
node = m
class MaxHeap:
  def __init__(self):
    self.data = [None]
def insert(self, item):
  self.data.append(item)
  m = len(self.data) - 1
  while m != 1:
    parentNum = m // 2
    if self.data[m] > self.data[parentNum]:
      self.data[m], self.data[parentNum] = self.data[parentNum], self.data[m]
      m = parentNum
    else:
      break
def remove(self):
  if len(self.data) > 1:
    self.data[1], self.data[-1] = self.data[-1], self.data[1]
    data = self.data.pop(-1)
    self.maxHeapify(1)
  else:
    data = None
  return data
def maxHeapify(self, i):
  left = i * 2
  right = i * 2 + 1
  smallest = i
  if left < len(self.data) and self.data[left] > self.data[smallest]:
    smallest = left
  if right < len(self.data) and self.data[right] > self.data[smallest]:
    smallest = right
  if smallest != i:
    self.data[i]. self.data[smallest] = self.data[smallest], self.data[i]
    self.maxHeapify(smallest)
def heapsort(unsorted):
  H = MaxHeap()
  
  for item in unsorted:
    H.insert(item)
    
  sorted = []
  
  d = H.remove()
  
  while d:
    sorted.append(d)
    d = H.remove()
  return sorted