본문 바로가기

Data Structure/Algorithm

Sort Algorithm - Heap

Heap

- Heap = 최솟값과 최대값을 빠르게 찾아내기 위해 완전2진트리 형태로 만들어진 data structure

Heap이 가지는 기본 특성

left child node = index * 2 + 1

right child node = index * 2 + 2

parent node = (index-1) / 2

 

 

- 오름차순 정렬 : 최대 Heap, 내림차순 정렬 : 최소 Heap 사용

최대 Heap : Parent node의 value(key value) <= Child node의 value

최소 Heap : Parent node의 value(key value) >= Child node의 value


Java예시

HeapSort() : Heap Sort Algo. 실행

 

sort1() : heapify()를 이용해 Max Heap을 얻는 함수

 

if(size<2){return;} : Parent node를 이용해 heapify하는 과정에서 -정수가 발생하면 참조 오류가 발생하므로 element의 개수가 적을 때는 굳이 Heap Sort를 쓸 필요까지 없어 바로 종료시키는 조건

 

int parentIdx = getParent(size-1); : 가장 마지막 element의 parent index

 

for(int i = parentIdx; i >=0; i--){heapify(a, i, size-1);} : max Heap 구하기

 

for(int i = parentIdx; i >=0; i--){ swap(a, 0, i); heapify(a, i, size-1);} : Root의 0번째 index와 i번째 index 서로 교환 후 0~(i-1)까지의 부분 tree에 대해 max heap을 만족하도록 재구성

 

getParent() : parent의 index를 얻는 함수

- heapify() : Heap정렬 수행

현재 Parent index의 child node의 index가 마지막 index를 넘지 않을 때까지 반복(왼쪽 child node를 기준으로 진행)if(a[leftChildIdx] > a[largestIdx] ){ largestIdx  = leftChildIdx ;} : left child node와 비교

if(a[rightChildIdx] > a[largestIdx] ){ largestIdx  = rightChildIdx ;} : right child node와 비교

if( largestIdx != parentIdx ){swap(a, parentIdx, largestIdx); parentIdx = largestIdx;} else{return;} : 교환 발생시 2개 element 교체 후 교환된 child node를 Parent node로 교체

 

- main함수에서 실행한 결과


C예시

- 추가 예정

 

 

'Data Structure > Algorithm' 카테고리의 다른 글

Recursive Algorithm - Fibonacci  (0) 2024.04.08
Recursive Algorithm - Recursive Function  (1) 2024.04.07
Sort Algorithm - Quick  (0) 2024.03.31
Sort Algorithm - Merge  (0) 2024.03.30
Sort Algorithm - Shell  (0) 2024.03.29