힙 정렬이란?
힙 자료구조의 루트를 뽑아 정렬하는 알고리즘
시간 복잡도
최상 : \( O(n \log n) \)
최악 : \( O(n \log n) \)
관련 글
[Algorithm] Sort #1 - 버블 정렬 Bubble Sort
[Algorithm] Sort #2 - 선택 정렬 Selection Sort
[Algorithm] Sort #3 - 삽입 정렬 Insertion Sort
[Algorithm] Sort #4 - 병합 정렬 Merge Sort
[Algorithm] Sort #6 - 퀵 정렬 Quick Sort
병합 정렬에 이어서 평균 시간 복잡도가 \( O(n^2) \)인 정렬 알고리즘 중 두번째는 힙 정렬입니다. 자료구조 중에서 힙(heap)의 특성을 이용해 정렬을 구현한 알고리즘입니다. 선택 정렬과 같이 원소 중에서 최솟 값을 찾아 순차적으로 정렬 시키지만 최솟 값을 찾기 위해 힙을 사용한다는 점이 차이점입니다.
힙(heap) 완전 이진트리의 자료구조로 최소 힙, 최대 힙이 있다. 최소, 최대 힙에 따라 부모 노드는 자식 노드보다 항상 작은 값이나 큰 값을 가진다. 삽입, 삭제의 경우 \( O(\log n) \)의 시간이 걸린다. |
알고리즘
힙 정렬의 알고리즘은 다음과 같습니다.
- 리스트의 원소들을 모두 힙에 넣는다.
- 힙의 루트 원소를 뽑아 정렬 시킬 배열에 넣고 힙에서는 제거한다.
- 2의 과정을 n번 진행한다.
힙 정렬 예시
{ 9, 1, 7, 5, 2} 순서대로 원소가 존재한다고 가정했을 때 힙 정렬의 예시는 다음과 같습니다. {9, 1, 7, 5, 2}의 원소들을 순서대로 힙에 삽입하는 작업을 진행하고 삽입 결과 힙의 구조는 아래와 같습니다. 힙이 만들어졌다면 루트의 값을 배열에 순차적으로 넣는 작업을 n번 진행합니다.
시간 복잡도 계산
힙 정렬의 시간복잡도는 최악, 최상의 경우가 같습니다.
힙 구성
먼저 리스트의 원소들을 가지고 힙을 만들어주는 작업이 필요합니다. 힙의 삽입에 걸리는 시간은 \( O(\log n) \)이므로 총 \( O(n \log n) \)의 시간이 걸립니다.
리스트 정렬
힙의 구성이 완료되었다면, 루트의 값을 저장 후 삭제하는 작업이 필요합니다. 힙의 삭제에 걸리는 시간 또한 \( O(\log n) \)이고 이 과정을 총 n번 하기 때문에 \( O(n \log n) \)의 시간이 걸립니다.
이전 글에서 병합 정렬은 리스트의 상태에 관계 없이 \( O(n \log n) \)의 시간 복잡도를 가진다고 설명했습니다. 이와 마찬가지로 힙 정렬도 리스트의 상태에 관계 없이 일정하게 \( O(n \log n) \)의 시간 복잡도를 가집니다.
C++ Code
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int main()
{
vector<int> arr = {9,1,7,5,2};
priority_queue<int, vector<int>, greater<int>> heap;
for(int i=0; i<arr.size(); i++)
heap.push(arr[i]);
for(int i=0; i<arr.size(); i++){
arr[i] = heap.top();
heap.pop();
}
for(int i=0; i<arr.size(); i++)
cout << arr[i];
}
'Computer Science > Algorithm' 카테고리의 다른 글
[Algorithm] Sort #6 - 퀵 정렬 Quick Sort (0) | 2021.01.16 |
---|---|
[Algorithm] Sort #4 - 병합 정렬 Merge Sort (0) | 2021.01.08 |
[Algorithm] Sort #3 - 삽입 정렬 Insertion Sort (1) | 2021.01.04 |
[Algorithm] Sort #2 - 선택 정렬 Selection Sort (0) | 2021.01.02 |
[Algorithm] Sort #1 - 버블 정렬 Bubble Sort (0) | 2020.12.29 |