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