__JMY__
MY Devblog
__JMY__
전체 방문자
오늘
어제
  • 분류 전체보기 (52)
    • Dev (52)
      • Algorithm (6)
      • Linux (12)
      • Network (7)
      • Container (2)
      • Python (14)
      • Frontend (2)
      • Etc (9)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • SCP
  • Docker
  • algorithm
  • certificate
  • network
  • Tuple
  • frontend
  • hash
  • Kubernetes
  • flexbox
  • Ingress
  • Sorting
  • Linux
  • react
  • tcpdump
  • Python
  • hikaricp
  • flask
  • springboot
  • wget

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
__JMY__

MY Devblog

Dev/Algorithm

Heap Sort (힙정렬)

2020. 12. 29. 16:16

Heap Sort (힙정렬)

힙 정렬은 비교기반 정렬 알고리즘으로 선택정렬의 향상된 버전으로 볼 수 있습니다.

선택정렬과 유사하게 정렬된 영역과 정렬되지 않은 영역으로 나누고 정렬되지 않은 영역의 가장 큰 요소를 추출한 후 정렬된 영역에 삽입합니다.

선택정렬과 다른 점은 힙 정렬은 정렬되지 않은 영역의 선형탐색에 시간을 낭비하지 않습니다.

잘 구현된 퀵 정렬보다는 실행속도가 다소 느리며 O(nlogn)의 시간복잡도를 가집니다.

Heap Sort 정렬과정

  1. 정렬해야 할 요소들로 최대 힙 트리 를 구성합니다. (내림차순으로 정렬은 최소 힙 트리)
    • 최대 힙: 완전 트리이면서 모든 노드가 자식들보다 큰 트리
    • 최소 힙: 완전 트리이면서 모든 노드가 자식들보다 작은 트리
  2. 가장 큰 수(루트에 위치)를 힙에서 꺼내 배열의 마지막 요소와 교환합니다.
  3. 위치를 바꾼 후 루트노드부터 다시 힙을 구성합니다. (이미 정렬된 마지막 노드를 제외)

1) 최대 힙 구성

초기상태: (8 2 7 1 6 9 3)

i = 2

  • (8 2 7 1 6 9 3), 7 < 9 swap --> (8 2 9 1 6 7 3)

i = 1

  • (8 2 9 1 6 7 3), 2 < 6 swap --> (8 6 9 1 2 7 3)

i = 0

  • (8 6 9 1 2 7 3), 8 < 9 swap --> (9 6 8 1 2 7 3)
  • (9 6 8 1 2 7 3), 8 > 7, 8 > 3 pass --> (9 6 8 1 2 7 3)

결과: (9 6 8 1 2 7 3)

2) 정렬

(9 6 8 1 2 7 3)

  • swap and delete --> (3 6 8 1 2 7)
  • (3 6 8 1 2 7), 3 < 8 swap --> (8 6 3 1 2 7)
  • (8 6 3 1 2 7), 3 < 7 swap --> (8 6 7 1 2 3)
  • heap: (8 6 7 1 2 3), sorted: (9)

(8 6 7 1 2 3)

  • swap and delete --> (3 6 7 1 2)
  • (3 6 7 1 2), 3 < 7 swap --> (7 6 3 1 2)
  • heap: (7 6 3 1 2), sorted: (8 9)

(7 6 3 1 2)

  • swap and delete --> (2 6 3 1)
  • (2 6 3 1), 2 < 6 swap --> (6 2 3 1)
  • heap: (6 2 3 1), sorted: (7 8 9)

(6 2 3 1)

  • swap and delete --> (1 2 3)
  • (1 2 3), 1 < 3 swap --> (3 2 1)
  • heap: (3 2 1), sorted: (6 7 8 9)

(3 2 1)

  • swap and delete --> (1, 2)
  • (1, 2), 1 < 2 swap --> (2 1)
  • heap: (2 1), sorted: (3 6 7 8 9)

(2 1)

  • swap and delete (1)
  • heap: (1), sorted: (2 3 6 7 8 9)

(1)

  • delete ()
  • heap: (), sorted: (1 2 3 6 7 8 9)

결과: (1 2 3 6 7 8 9)

Heap Sort 코드 (Python)

def heapify(arr, index, heap_size):
    largest = index
    left_index = 2 * index + 1
    right_index = 2 * index + 2
    if left_index < heap_size and arr[left_index] > arr[largest]:
        largest = left_index

    if right_index < heap_size and arr[right_index] > arr[largest]:
        largest = right_index

    if largest != index:
        arr[largest], arr[index] = arr[index], arr[largest]
        heapify(arr, largest, heap_size)

def heap_sort(arr):
    length = len(arr)

    for i in range(length // 2 - 1, -1, -1):
        heapify(arr, i, length)

    for i in range(length - 1, 0 , -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, 0, i)
    return arr
반응형

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

Merge Sort (병합정렬)  (0) 2021.07.15
다익스트라(Dijkstra) 알고리즘  (0) 2021.04.13
Insertion Sort (삽입정렬)  (0) 2020.12.23
Selection Sort (선택정렬)  (0) 2020.12.22
Bubble Sort (버블정렬)  (0) 2020.12.22
    'Dev/Algorithm' 카테고리의 다른 글
    • Merge Sort (병합정렬)
    • 다익스트라(Dijkstra) 알고리즘
    • Insertion Sort (삽입정렬)
    • Selection Sort (선택정렬)
    __JMY__
    __JMY__
    공부내용 정리 블로그

    티스토리툴바