💡 완전 이진 트리(Complete Binary Tree)의 일종으로, 모든 노드의 값이 특정 규칙을 만족하는 자료구조
❓ 완전 이진 트리
이진 트리 구조에서 모든 레벨이 꽉 차 있거나, 마지막 레벨을 제외한 모든 노드가 채워져있는 이진트리이다.
마지막 레벨의 노드들은 왼쪽부터 순서대로 차있다.
출처 : https://chamdom.blog/binary-tree/
💡 부모 노드의 값이 자식 노드의 값보다 작거나 같은 완전 이진 트리
1
/ \
3 6
/ \ / \
5 9 8 7
💡 부모 노드의 값이 자식 노드의 값보다 크거나 같은 완전 이진 트리
9
/ \
7 8
/ \ / \
5 3 6 1
💡 힙 자료구조를 기반으로 한 정렬 알고리즘
일반적으로 최대 힙 Max Heap을 이용하여 오름차순 정렬을 수행
function heapify(arr, size, root) {
let largest = root;
const left = 2 * root + 1;
const right = 2 * root + 2;
if (left < size && arr[left] > arr[largest]) largest = left;
if (right < size && arr[right] > arr[largest]) largest = right;
if (largest !== root) {
[arr[root], arr[largest]] = [arr[largest], arr[root]];
heapify(arr, size, largest); // 재귀적으로 변경된 노드에 대해 heapify 수행
}
}
function buildMaxHeap(arr){
const len = arr.length;
for(let i = Math.floor(len / 2) - 1; i >= 0 ; i--){
heapify(arr, len, i);
}
}
function heapSort(arr) {
const len = arr.length;
// 최대 힙 변환
buildMaxHeap(arr);
// 하나씩 추출하여 정렬
for (let i = len - 1; i > 0; i--) {
[arr[0], arr[i]] = [arr[i], arr[0]];
heapify(arr, i, 0);
}
return arr;
}
console.log(heapSort([5, 3, 8, 4, 2])); // [2, 3, 4, 5, 8]