개념
-
데이터에서 최소값과 최대값을 빠르고 쉽게 찾기 위한
완전이진트리
형태의 자료구조
- 완전이진트리: 마지막 레벨을 제외한 모든 레벨이 채워지고 마지막 레벨만 좌 → 우 구조
-
모든 노드의 데이터는 부모노드는 자식 노드의 값보다 크거나 같다
힙 정렬
- root노드를 맨 마지막 인덱스 노드와 swap
- 맨 마지막 인덱스 노드는 없는 노드 취급하고 root 노드에서 heapify 작업
- 다시 root노드를 맨 마지막 인덱스 노드와 swap (2번에서 작업한 노드 제외)
- 반복
힙 정렬과 힙의 시간복잡도
힙의 시간 복잡도
힙의 높이는 O(log(n))
→ 왼쪽, 오른쪽 자식은 (root * 2), (root * 2 + 1)이기에 log(n)
번씩 건너서 확인하기 때문이고 이것을 전체 길이 n번만큼 반복하기에 힙의 시간 복잡도는 O(nlog(n))
힙정렬 시간 복잡도
- 리스트를 힙으로 생성
- nlog(n) → 한번의 heapify는 log(n) + 노드 전체 수가 n
- 루트 노드와 마지막 노드의 위치 변경 (변경 후 변경된 루트 노드는 없는 취급)
- n(1) → 없는거나 다름 없음
- 새로운 루트 노드가 힙 속성을 지킬 수 있게 heapify
- log(n) → 2와 3 합치면 log(n)
- 힙에 남아 있는 노드가 없도록 위에 2~3 반복
- nlog(n) → 1번의 행위를 다시 하는 것과 같음 (노드 전체)
정리하면 1번과 4번을 합쳤을때 2nlog(n) → O(nlog(n))
힙 정렬
은 O(nlog(n))
의 시간복잡도를 가진다.
예제 코드
|
|