힙 정렬(heap sort)(1)

Reading time ~1 minute

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

Heap과 Heapsort

  • 최악의 경우 시간복잡도 O(nlogn)

  • Sorts in place - 추가 배열 불필요

  • 이진 힙(binary heap) 자료구조를 사용

Heap은

  • compleate binary tree이면서

  • heap property를 만족해야한다.

힙은

Full v.s Complete Binary Trees

이진트리

  • Level

    부모로부터 몇칸 떨어져 있는가

힙은 일차원 배열로도 표현 가능하다

힙배열

complete binary 트리이기때문에 인덱스를 통해 누구의 자식인지 알수 있다.


MAX-HEAPIFY

MAX-HEAPIF

  • 힙이라는 자료구조를 다루기 위한 필요한 기본연산.

  • 전체가 heap을 만족하도록 각 노드들의 위치를 조정하는 과정.

  • 자식의 값보다 부모의 값이 더 작으면 더 큰 자식과 부모를 바꿔가며 heap을 만족해 나간다.

수도코드

  • recursive version

    MAX-HEAPIFY(A, i){
      if there is no child of A[i]{
        return;
      }
      k <- index of the biggest child of i;
      if A[i] >= A[k]{
        return;
      }
      exchange A[i] and A[k];
      MAX-HEAPIFY(A, k);
    }
    

    (root 노드에 대한 heapify는 MAX-HEAPIFY(1)을 호출하면 된다.)

  • iterative version

    MAX=HEAPIFY(A, i){
      while A[i] has a child do{
        k <- index of the biggest child of i;
        if A[i] >= A[k]{
          return;
        }
        exchange A[i] and A[k];
        i = k;
      }
      end.
    }