e.den
eden.dev.log
e.den
전체 방문자
오늘
어제
  • 분류 전체보기 (57)
    • 슬기로운 취준 생활 (1)
    • Study (30)
      • Swift (7)
      • iOS (6)
      • Java (2)
      • Spring (6)
      • Algorithm (9)
    • Coding Test (8)
      • Swea (0)
      • Baekjoon (8)
      • Programmers (0)
    • 삽질기 (3)
    • 독서록 (15)
      • Clean Architecture (5)
      • Clean Code (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • cleancode
  • 알고리즘
  • lombok
  • UITextView
  • CleanArchitecture
  • 자료구조
  • RunLoop
  • MySQL
  • CGLayer
  • Algorithm
  • java
  • 정렬
  • property
  • 프로퍼티
  • 클린아키텍처
  • CoreAnimation
  • 부스트코스
  • ios
  • swift
  • reduce
  • initializer
  • 고차함수
  • compactMap
  • Spring
  • mybatis
  • Map
  • lifecycle
  • flatmap
  • 클린코드
  • Filter

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
e.den

eden.dev.log

[정렬] 힙 정렬(Heap Sort)
Study/Algorithm

[정렬] 힙 정렬(Heap Sort)

2020. 4. 14. 01:07

힙 (heap)

- 완전 이진트리(complete binary tree)로서 다음 성질을 만족한다.

- 최소 힙(min heap): 각 노드의 값은 자식(child) 노드의 값보다 작거나 같다.

  ▷ 루트 노드가 최소값임

- 최대 힙(max heap): 각 노드의 값은 자식(child) 노드의 값보다 크거나 같다.

  ▷ 루트 노드가 최댓값임

 

힙 정렬

- 주어진 배열을 힙으로 만든 다음, 차례로 하나씩 힙에서 제거함으로써 정렬한다.

 

힙을 배열로 표현하면 아래와 같다.

Heap의 배열 표현

다음은 힙을 만드는 알고리즘이다.

buildHeap(A[], n) { // A[1...n]을 힙으로 만든다.
    for i ← n/2 downto 1 
       heapify(A, i, n); // 힙 재구성
}

 

그리고 힙을 재구성하는 알고리즘이다.

heapify(A[], k, n)  // n은 최대 인덱스
// A[k]의 두 자식을 루트로 하는 서브트리는 힙 성질을 이미 만족하고 있다.
// A[k]를 루트로 하는 트리를 힙 성질을 만족하도록 재구성한다.
{
    // 큰 자식을 고른다.
    left ← 2k; right ← 2k+1;
    if(right <= n) then { // 자식이 둘인 경우
         if(A[left] > A[right]) then bigger ← left; else bigger ← right;
    }
    else if(left <= n) then bigger ← left; // 왼쪽 자식만 있는 경우
    else return; // 자식이 없는 경우 (종료)
    
    // 큰 자식이 부모보다 크면 힙 성질 위반이므로 계속 재조정 작업
    if(A[bigger] > A[k]) then {
        A[k] ↔ A[bigger];
        heapify(A, bigger, n);
    }
}

 

힙 생성 후 오름차순으로 정렬한다.

heapSort(A[], n) { // A[1...n]을 힙 정렬 한다.
    buildHeap(A, n);          // 힙 만들기       : O(n log n)
    for i ← n downto 2 {      //                : n-1 번 수행
          A[1] ↔ A[i];        // 교환(A[1] 제거) : O(1)
          heapify(A, 1, i-1); // 힙 재구성       : O(log n)
    }
}

 

이와 같이 힙 정렬은 최악의 경우에도 O(n log n) 시간이 소요된다.

'Study > Algorithm' 카테고리의 다른 글

[정렬] 계수 정렬(Counting Sort)  (3) 2020.04.16
[정렬] 기수 정렬(Radix Sort)  (5) 2020.04.16
[정렬] 퀵 정렬(Quick Sort)  (3) 2020.04.13
[정렬] 병합 정렬(Merge Sort)  (3) 2020.04.13
[정렬] 삽입 정렬(Insertion Sort)  (6) 2020.04.13
    'Study/Algorithm' 카테고리의 다른 글
    • [정렬] 계수 정렬(Counting Sort)
    • [정렬] 기수 정렬(Radix Sort)
    • [정렬] 퀵 정렬(Quick Sort)
    • [정렬] 병합 정렬(Merge Sort)
    e.den
    e.den
    문제를 본질적으로 접근하자

    티스토리툴바