전과 면접 때 힙정렬을 엉망으로 설명했던 기억이 나서 다시 한 번 복습할 겸 블로그를 작성해보려고 한다.
그렇다면 완전 이진 트리는 무엇일까?
면접 때 힙 정렬 build의 시간복잡도를 θ(NlogN)이라고 당당하게 말했던 것이 부끄러워서 다시 한 번 정리해보려고 한다.
우선, 면접 때 말한 방식대로 n개를 insert 하는 방식으로 heap을 구현하면 nlogn의 시간복잡도를 갖는 것이 맞다. 하지만 정렬하지 않고 우선 완전이진트리를 만들어놓고 level이 큰 노드부터 차례대로 percolate down 방식을 사용하면 시간복잡도를 θ(n)으로 만들 수 있다.
사실 면접 때 정렬에 있어서 θ(nlogn)보다 절대 빠를 수 없다고 확신했었다. 모든 요소를 읽는 데에만 n번의 연산이 필요한데 이를 θ(n)으로 정렬까지 할 수 있을 것이라고는 생각지도 못했다. 그래서 이 부분을 복습하면서 더 재미있었던 것 같다.
A = [4, 1, 8, 7, 3, 3', 5, 2, 9] 를 heap sort 하는 과정을 살펴보자.
가장 깊이가 낮은 노드의 부모 노드들부터 차례대로 자식들과 비교해가며 자리를 찾아가면 된다.
이때 level이 i인 노드는 최대 개가 존재하며, d-1번의 연산으로 제 자리를 찾아갈 수 있다.
증명)
깔끔하게 heap sort를 복습할 수 있어서 좋네요! 관련 문제도 풀어봐야겠어요!!~~