Programing/javascript

힙 정렬 (Heap Sort) 설명과 JavaScript 예제

2025. 5. 22. 08:32
반응형

힙 정렬은 완전 이진 트리의 일종인 '힙(Heap)' 자료구조를 활용한 정렬 알고리즘입니다. 선택 정렬과 유사하지만, 최대값 또는 최소값을 효율적으로 선택하기 위해 힙 구조를 사용합니다. 시간 복잡도가 항상 O(n log n)으로 일정하며, 추가 메모리 없이 정렬할 수 있는 장점이 있습니다.


1. 힙의 개념

  • 최대 힙 (Max Heap): 부모 노드가 자식 노드보다 크거나 같음
  • 최소 힙 (Min Heap): 부모 노드가 자식 노드보다 작거나 같음

힙 정렬에서는 일반적으로 최대 힙을 사용하여 가장 큰 값을 루트로 올리고 배열의 뒤로 보냅니다.


2. 동작 원리

  1. 배열을 최대 힙 구조로 변환 (build max heap)
  2. 힙의 루트(최대값)를 배열 끝으로 보냄
  3. 힙 크기를 줄이고 다시 heapify 수행
  4. 위 과정을 반복하여 정렬 완료

3. JavaScript 예제 - 오름차순 정렬

function heapSort(arr) {
  const n = arr.length;

  // 최대 힙 구성
  for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
    heapify(arr, n, i);
  }

  // 하나씩 루트 추출하여 정렬
  for (let i = n - 1; i > 0; i--) {
    [arr[0], arr[i]] = [arr[i], arr[0]]; // 최대값을 끝으로
    heapify(arr, i, 0); // 줄어든 힙에 대해 heapify
  }

  return arr;
}

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);
  }
}

console.log(heapSort([4, 10, 3, 5, 1])); // [1, 3, 4, 5, 10]
  • heapify: 주어진 노드를 기준으로 최대 힙 조건을 만족하도록 재정렬
  • heapSort: 전체 배열에 대해 최대 힙 생성 후, 루트를 정렬 영역으로 보내며 반복

4. 성능 분석

구분
시간 복잡도
최선의 경우 O(n log n)
평균 O(n log n)
최악의 경우 O(n log n)
  • 공간 복잡도: O(1) (제자리 정렬)
  • 안정 정렬이 아님: 동일한 값의 상대 순서가 바뀔 수 있음

5. 힙 정렬의 특징

  • 항상 일정한 시간 복잡도 보장
  • 추가 메모리 없이도 정렬 가능 (in-place)
  • 안정 정렬이 아니라는 점에서 병합 정렬과는 차이 있음

마무리

힙 정렬은 대규모 데이터를 안정적으로 처리할 수 있는 알고리즘 중 하나입니다. 특히 메모리 사용을 최소화해야 하거나 최악의 경우에도 성능이 유지되어야 할 때 유용합니다.

자바스크립트에서 기본 제공되는 sort()는 힙 정렬이 아닌, 구현체에 따라 병합/퀵 기반이므로 필요에 따라 직접 구현해보는 것도 좋습니다.

반응형

'Programing > javascript' 카테고리의 다른 글

JavaScript로 구현하는 게임 데미지 단위 축약 (A ~ ZZZZ)  (0) 2025.05.27
JavaScript로 구현하는 금액 단축 표기 (K / M / B 표기법)  (0) 2025.05.27
JavaScript로 구현하는 금액의 영어 단위 변환 (Number to Words)  (0) 2025.05.27
기수 정렬 (Radix Sort) 설명과 JavaScript 예제  (1) 2025.05.22
JavaScript 비교 연산자  (1) 2025.05.18
JavaScript 조건문  (0) 2025.05.18
JavaScript 반복문  (0) 2025.05.18
함수 선언식과 함수 표현식의 차이  (2) 2025.05.05
'Programing/javascript' 카테고리의 다른 글
  • JavaScript로 구현하는 금액의 영어 단위 변환 (Number to Words)
  • 기수 정렬 (Radix Sort) 설명과 JavaScript 예제
  • JavaScript 비교 연산자
  • JavaScript 조건문
Dongkkase
Dongkkase
개발자로 일하면서 부딪히는 문제풀이가 누군가에게 도움이 되길 바라며
    반응형
  • Dongkkase
    정집사의 개발로그
    Dongkkase
  • 전체
    오늘
    어제
    • All (478)
      • 금융 (61)
      • Programing (295)
        • Algorithm (39)
        • API (2)
        • javascript (122)
        • CSS (8)
        • HTML (10)
        • PHP (15)
        • JAVA (27)
        • JSP (17)
        • JSP 예제 (1)
        • IOS (1)
        • Android (1)
        • Sencha Touche (1)
        • bat file, cmd (0)
        • 디버깅 (2)
        • SQL (21)
        • MS-SQL (1)
        • MySQL (13)
        • 보안 (5)
      • Server (14)
        • Docker (1)
        • Windows (9)
        • Linux (3)
        • jeus (1)
      • Database (6)
      • IT 일반 (15)
      • 리뷰 (38)
        • Book (17)
        • 제품 (2)
        • 영화 소개 (11)
        • 음악 소개 (7)
      • 잡생각 (36)
        • 회고 (3)
        • 컬럼 (4)
        • 자료실 (6)
        • 낙서장 (12)
        • 위시리스트 (2)
        • WOW (1)
        • 덕 (1)
  • 인기 글

  • 최근 댓글

  • 태그

    사고 싶은 책
    IT·컴퓨터
    SQL
    IT블로그
    위시리스트
    php
    디자인패턴
    읽고 싶은 책
    iT's MY LiFE
    자바스크립트
    IT 관련
    It
    블로그
    js패턴
    jsp
    자바
    Java
    자바스크립트유틸
    JavaScript
    기초
Dongkkase
힙 정렬 (Heap Sort) 설명과 JavaScript 예제
상단으로

티스토리툴바