힙정렬이란 ?
리스트나 배열을 먼저 최소힙이나 최대힙으로 바꾸고 원소들을 순서대로 정렬하는 방법이다.
최소힙은 최소값을 구할 때, 최대힙은 최대값을 구할 때 사용한다.
최대힙이란?
완전 이진 트리이면서, 부모노드는 자식 노드보다 크다.
삽입) 새 노드에 삽입이 되고 나서, 최대 힙이 될 때까지 위로 올라가는 과정을 반복한다.
부모 노드보다 값이 클 경우, 서로 교환하면서 위로 올라가는 과정을 반복
삭제) 힙의 루트에서 삭제한다. 그러면 루트가 비어있는 상태가 되고, 가장 마지막 노드를 루트 노드로 올린다.
이후 새로 올린 노드가 제자리를 찾아갈 수 있도록 연산을 반복한다.
*완전 이진 트리
노드를 삽입할 때 왼쪽부터 차례대로 삽입하는 트리이다.
2. 최소힙이란?
완전 이진 트리이면서, 각 노드의 키 값이 그 자식의 키 값보다 크지 않다.
3. heapq 모듈
파이썬에서는 heapq 모듈을 사용해서 최소 힙과 최대 힙을 구현할 수 있다.
내부 메소드) heappush와 heappop이 있다.
heappush(heap,item): 힙 불변성을 유지하면서, item 값을 heap으로 push 해주는 메소드이다.
heappop(heap): 힙 불변성을 유지하면서, heap에서 가장 작은 항목을 pop하고 반환해주는 메소드이다.
4. 구현
* 최소힙의 구현
import heapq
heap=[]
for i in range(1,6):
heapq.heappush(heap,i)
for i in range(5):
print(heapq.heappop(heap))
* 최대 힙의 구현
import heapq
heap=[]
values=[1,5,3,2,4]
for value in values:
heapq.heappush(heap,-value)
for i in range(5):
print(-heapq.heapop(heap))
참고)
'CS Study > 자료구조' 카테고리의 다른 글
[자료구조] 메모리 구조 (0) | 2023.06.29 |
---|---|
[자료구조] DFS & BFS (0) | 2023.02.27 |
[자료구조] 큐, 스택 (0) | 2023.02.27 |
기본 정렬 알고리즘 (0) | 2022.07.07 |
DFS vs BFS (0) | 2022.07.05 |