[파이썬] 힙 정렬 (Heap Sort)의 원리와 구현

힙 정렬 (Heap Sort)은 정렬 알고리즘 중 하나로, 힙 자료구조를 기반으로 동작합니다. 힙 정렬은 평균 시간 복잡도와 최악 시간 복잡도 모두 O(n log n)으로 빠른 정렬 알고리즘입니다. 이번 포스트에서는 힙 정렬 알고리즘의 원리와 python으로의 구현에 대해 알아보겠습니다.

힙 정렬의 원리

힙 정렬은 크기를 갖는 힙 트리를 이용하여 정렬을 수행합니다. 힙 트리는 부모 노드의 값이 자식 노드의 값보다 항상 큰 트리 구조입니다. 트리의 가장 위에 있는 노드를 루트 노드라고 합니다.

힙 정렬의 원리는 다음과 같습니다:

  1. 정렬할 리스트를 입력받습니다.
  2. 리스트를 힙 구조로 변환합니다.
  3. 힙에서 가장 큰 요소(루트 노드)를 추출합니다.
  4. 추출한 요소를 정렬된 리스트에 추가합니다.
  5. 힙의 크기를 줄이고, 다시 2단계부터 반복합니다.
  6. 힙이 비어있을 때까지 반복하여 정렬된 리스트를 얻습니다.

힙 정렬의 구현 (python)

# 힙을 구성하는 함수
def heapify(arr, n, i):
    largest = i  # 루트 노드를 가장 큰 값으로 설정
    left = 2 * i + 1  # 왼쪽 자식 노드
    right = 2 * i + 2  # 오른쪽 자식 노드

    # 왼쪽 자식 노드가 부모 노드보다 큰 경우
    if left < n and arr[i] < arr[left]:
        largest = left

    # 오른쪽 자식 노드가 부모 노드나 가장 큰 자식 노드보다 큰 경우
    if right < n and arr[largest] < arr[right]:
        largest = right

    # 가장 큰 노드를 부모 노드로 설정하고, 재귀적으로 힙을 구성
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)


# 힙 정렬 함수
def heap_sort(arr):
    n = len(arr)

    # 최대 힙을 구성
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 힙에서 요소를 하나씩 추출하여 정렬된 리스트에 추가
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 루트 노드와 맨 마지막 요소를 교환
        heapify(arr, i, 0)  # 힙 구성

    return arr


# 힙 정렬 사용 예시
arr = [12, 11, 13, 5, 6, 7]
sorted_arr = heap_sort(arr)
print("정렬된 배열:", sorted_arr)

위의 코드는 python으로 힙 정렬 알고리즘을 구현한 예시입니다. heapify 함수는 힙을 구성하기 위해 사용되고, heap_sort 함수는 힙 정렬을 수행합니다. arr 리스트에 정렬할 값들을 입력하고, heap_sort(arr)를 호출하여 정렬된 결과를 얻을 수 있습니다.

힙 정렬은 자료구조인 힙에 기반하므로, 입력 크기에 따라 효율적인 정렬을 수행할 수 있습니다. 시간 복잡도가 O(n log n)이기 때문에 대량의 데이터에도 빠르게 정렬할 수 있는 장점이 있습니다.