Algorithm JS - 힙 정렬

jiny·2022년 9월 27일
0

JavaScript Algorithm

목록 보기
14/23
post-thumbnail
let array = require("fs")
  .readFileSync(__dirname + "/input.txt")
  .toString()
  .split("\n")
  .slice(1)
  .join()
  .split(" ")
  .map((i) => Number(i));

function heapSort(arr) {
  for (let i = arr.length - 1; i >= 0; i--) {
    // 최대 힙으로 만듬
    arr = maxHeap(arr, i);
    // 만약 arr[0] > arr[i]일 경우 첫번째 노드와 마지막 노드 스왑 but, 1과 1이 같을 경우 스와핑 x
    if (arr[0] > arr[i]) {
      [arr[i], arr[0]] = [arr[0], arr[i]];
    }
  }
  return arr;
}

function maxHeap(array, lastIdx) {
  const arr = array;
  // 부모 인덱스
  let parentIdx = Math.floor(lastIdx / 2) - 1;
  // 부모 인덱스가 1이 될 때까지 순회(가장 높은 인덱스의 부모 노드 부터 시작)
  while (parentIdx !== -1) {
    // 왼쪽 자식 인덱스와 오른쪽 자식 인덱스 지정
    let leftChildIdx = parentIdx * 2 + 1;
    let rightChildIdx = parentIdx * 2 + 2;
    // 만약 오른쪽 자식 노드가 없을 경우
    if (arr[rightChildIdx] === undefined) {
      // 만약 자식 노드가 부모 노드 보다 클 경우 서로 스왑
      if (arr[leftChildIdx] > arr[parentIdx])
        [arr[leftChildIdx], arr[parentIdx]] = [
          arr[parentIdx],
          arr[leftChildIdx],
        ];
    } else {
      // 만약 오른쪽 자식 노드가 있을 경우 3개의 값을 비교하여 자식 노드가 클 경우 부모 노드와 스왑
      let node = Math.max(
        ...[arr[leftChildIdx], arr[rightChildIdx], arr[parentIdx]]
      );
      if (node !== arr[parentIdx]) {
        const swapNodeIdx = arr.indexOf(node);
        [arr[parentIdx], arr[swapNodeIdx]] = [arr[swapNodeIdx], arr[parentIdx]];
      }
    }
    // 다음 부모 노드 비교를 위해 -1 낮춤
    parentIdx = parentIdx - 1;
  }
  return arr;
}

console.log(heapSort(array));

0개의 댓글