TIL

[TIL] 힙 정렬 Heap Sort

아람2 2024. 10. 22. 13:55
반응형

힙 정렬 Heap Sort

힙의 특성을 이용하여 정렬하는 알고리즘

힙은 '부모의 값이 자식보다 항상 크다'는 조건을 만족하는 완전 이진 트리

이 때 부모의 값이 항상 자식보다 작을 때도 힙을 만족한다

즉, 이러한 자식 부모 사이의 대소 관계가 일정하면 힙이다 

* 힙 Heap - 쌓아 놓음, 쌓아 놓은 더미 

 

힙에서 부모와 자식 간의 관계는 일정하지만, 형제 사이의 대소 관계는 일정하지 않으므로

부분 순서 트리 Partial Ordered Tree 라고 한다 

 

힙 정렬의 특징 

힙 정렬은 '힙에서 최대값은 루트에 위치한다'는 특징을 이용하여 정렬하는 알고리즘이다 

- 힙에서 최대값인 루트를 꺼낸다 
- 루트 이외의 부분을 힙으로 만든다 

 

이 과정에서 꺼낸 값을 나열하면 정렬이 끝난 배열이 완성된다 

루트를 삭제한 힙의 재구성

1. 루트를 꺼낸다
2. 마지막 원소 (가장 하단의 오른쪽에 위치한 원소) 를 루트로 이동한다 
3. 루트에서 시작하여 자신보다 값이 큰 자식과 자리를 바꾸고 아래쪽으로 내려가는 작업을 반복한다
  자식의 값이 작거나 리프의 위치에 도달하면 이동을 종료한다 (*리프 Leaf - 트리에서 자식이 없는 노드)

힙 정렬 알고리즘 알아보기 

1. i 값을 n-1 로 초기화한다

2. a[0] 과 a[i] 를 교환한다

3. a[0], a[1], ..., a[i-1] 을 힙으로 만든다

4. i 값을 1씩 감소시켜 0 이 되면 종료한다 (그렇지 않다면 2로 돌아간다)

배열을 힙으로 만들기 

가장 아랫부분의 서브트리부터 상향식 Bottom-up 으로 진행하여 전체 배열을 힙으로 만든다 

 

힙 정렬의 시간 복잡도

단순 선택 정렬은 정렬되지 않은 부분의 모든 원소 중에서 최대값을 선택해야 하고,

힙 정렬은 맨 앞의 원소를 꺼내는 것만으로 최대값을 구할 수 있지만 남은 원소를 힙으로 재구성해야 한다 

 

단순 선택 정렬에서 최대값인 원소를 선택하는 시간 복잡도는 O(n) 이지만

힙 정렬에서 다시 힙으로 만드는 작업의 시간 복잡도는 O(log n) 이다 

 

따라서 단순 선택 정렬의 시간 복잡도는 O(n^2) 이지만 (전체 비교 횟수가 n(n-1) / 2) 

힙 정렬은 원소의 개수만큼 작업을 반복하므로 전체 정렬하는 데 걸리는 시간 복잡도는 O(n) + nO(logn)= O(n logn) 이다 

 

반응형

'TIL' 카테고리의 다른 글

[TIL] Demand-Zero Memory  (1) 2024.10.22
[TIL] mmap()  (0) 2024.10.22
[TIL] DMA, Direct Memory Access  (1) 2024.10.21
[TIL] 시스템 콜 System Call  (0) 2024.10.21
[TIL] 단편화 Fragmentation  (2) 2024.10.19