힙정렬
힙정렬 Heap Sorting
힙정렬(Heap Sort)은 완전 이진트리 구조를 이용한 정렬 알고리즘으로서, 선택정렬(Selection Sort)의 개선된 버전으로 볼 수 있습니다. 힙정렬은 정렬되지 않은 리스트를 최대 힙(Max Heap)이나 최소 힙(Min Heap)으로 만든 다음, 루트 노드를 추출하여 정렬된 리스트에 추가하는 방식으로 동작합니다.
일반적인 단계
-
주어진 리스트를 최대 힙 또는 최소 힙으로 만듭니다.
이를 위해서는 주어진 리스트를 이진 트리로 변환하고, 트리의 루트부터 시작하여 각 노드가 자식 노드보다 크거나 작은지 확인하면서 재배치합니다.
이러한 과정을 “힙 만들기(heapify)”라고 합니다. -
최대 힙 또는 최소 힙에서 루트 노드를 추출하고, 정렬된 리스트에 추가합니다.
추출한 노드를 리스트의 맨 뒤에 배치합니다. -
남은 노드들에 대해 1과 2의 과정을 반복합니다.
-
리스트가 완전히 정렬될 때까지 1~3의 과정을 반복합니다.
시간 복잡도
이 알고리즘의 시간 복잡도는 O(nlogn)으로, 안정적인 정렬 알고리즘 중에서는 빠른 편에 속합니다.
최악의 경우에도 O(nlogn)을 보장하기 때문에 대부분의 경우에 효율적인 정렬 알고리즘으로 사용됩니다.
힙정렬 1 (최대 힙으로 만들기)
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[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
return arr
def heap_sort(arr):
n = len(arr)
# 최대 힙으로 만들기
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n , i)
print("최대 힙으로 만들기")
print(arr)
# 추출과 정렬
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
return arr
def heapify(arr, n, i):
largest = i # 루트 노드
left = 2 * i + 1 # 왼쪽 자식 노드
right = 2 * i + 2 # 오른쪽 자식 노드
# 왼쪽 자식과 비교
if left < n and arr[left] > arr[largest]:
largest = left
# 오른쪽 자식과 비교
if right < n and arr[right] > arr[largest]:
largest = right
# 루트 노드 변경
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr,n,largest)
arr = [ 3, 4 , 1, 2, 5]
arr_sort = heap_sort(arr)
최대 힙으로 만들기
[5, 4, 1, 2, 3]
print("추출 및 정렬")
print(arr_sort)
추출 및 정렬
[1, 2, 3, 4, 5]