CS STUDY/알고리즘

힙 정렬(Heap Sort)

cha_eyoon 2024. 3. 12. 18:28

힙 정렬(Heap Sort)

개념
  • 완전 이진 트리를 기본으로 하는 힙(Heap) 자료구조를 기반으로 한 정렬 방식 
  • 최대 힙 트리나 최소 힙 트리를 구성해 정렬
  • 내림차순 정렬을 위해서는 최대 힙 구성, 오름차순 정렬 위해서는 최소 힙 구성 
과정

 

  • 최대 값을 하나씩 뽑아내면서 정렬 
코드 
# Max Heapify 함수: 특정 인덱스의 노드를 최대 힙 형태로 유지하는 함수
def max_heapify(arr, n, i):
    largest = i  # 부모 노드의 인덱스로 초기화
    left = 2 * i + 1  # 왼쪽 자식 노드의 인덱스
    right = 2 * i + 2  # 오른쪽 자식 노드의 인덱스

    # 왼쪽 자식 노드가 부모 노드보다 크면 largest 값을 갱신
    if left < n and arr[largest] < arr[left]:
        largest = left

    # 오른쪽 자식 노드가 부모 노드보다 크면 largest 값을 갱신
    if right < n and arr[largest] < arr[right]:
        largest = right

    # largest 값이 갱신되었다면 노드를 교환하고, 재귀적으로 Max Heapify를 호출
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        max_heapify(arr, n, largest)

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

    # 입력 배열을 최대 힙 형태로 만듦
    for i in range(n // 2 - 1, -1, -1):
        max_heapify(arr, n, i)

    # 힙에서 최대 원소를 추출하고 정렬된 부분에 추가
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 최대 원소를 맨 뒤로 이동
        max_heapify(arr, i, 0)  # 힙 속성 유지

    return arr

# 테스트용 입력 배열
arr = [4, 10, 3, 5, 1]
sorted_arr = heap_sort(arr)

print("힙 정렬 결과:", sorted_arr)

 

특징
  • 장점
    • 안정적인 정렬 알고리즘
    • 최악의 경우에도 시간 복잡도가 O(NlogN)으로 효율적
  • 단점
    • 힙 정렬은 비교 기반의 정렬 알고리즘이므로 비교 연산이 많이 필요
    • 원본 배열을 파괴하므로 정렬되지 않은 배열의 복사본 필요 
시간 복잡도
  • O(Nlog2N)

 

참고

https://gr-st-dev.tistory.com/1935

 

파이썬을 사용한 힙 정렬 알고리즘 - 효율적인 정렬 방법

파이썬 구현: 힙 정렬(Heap Sort) 힙 정렬(Heap Sort)은 효율적인 정렬 알고리즘 중 하나로, 완전 이진 트리를 기반으로 구현된 정렬 방법입니다. 주어진 배열을 최대 힙(max heap) 또는 최소 힙(min heap)으

gr-st-dev.tistory.com