요약

내용

원리

  • 힙 트리를 이용하여 정렬한다.
    • 힙 트리는 완전 이진 트리의 일종으로 부모 노드의 키 값이 자식 노드의 키 값보다 항상 큰(작은) 이진 트리를 말한다. 트리, Tree with golang
    • 힙 트리는 중복된 값을 허용한다.

시간 복잡도

  • 모두 O(n log n)

장점

  • 메모리 사용이 적고 안정적이다.

단점

  • 데이터가 정렬되는 과정에서 비교 횟수가 많아질 수 있다.

구현체

package main
 
import "fmt"
 
// 힙 정렬
func heapSort(arr []int) {
	n := len(arr)
 
	// 최대 힙 만들기
	for i := n/2 - 1; i >= 0; i-- {
		heapify(arr, n, i)
	}
 
	// 힙에서 요소를 하나씩 제거하여 정렬
	for i := n - 1; i > 0; i-- {
		// 루트와 마지막 요소 교환
		arr[0], arr[i] = arr[i], arr[0]
		// 힙 크기를 줄이고 다시 최대 힙 구조를 만듬
		heapify(arr, i, 0)
	}
}
 
// 힙 구성
func heapify(arr []int, n, i int) {
	largest := i
	left := 2*i + 1
	right := 2*i + 2
 
	// 왼쪽 자식이 현재 노드보다 크면 largest 업데이트
	if left < n && arr[left] > arr[largest] {
		largest = left
	}
 
	// 오른쪽 자식이 largest보다 크면 largest 업데이트
	if right < n && arr[right] > arr[largest] {
		largest = right
	}
 
	// largest가 i가 아니면 값 교환 후 재귀 호출로 하위 트리 조정
	if largest != i {
		arr[i], arr[largest] = arr[largest], arr[i]
		heapify(arr, n, largest)
	}
}
 
func main() {
	arr := []int{3, 2, 5, 4, 1}
	fmt.Println("Before heapSort array:", arr)
 
	heapSort(arr)
	fmt.Println("After heapSort array:", arr)
}

참고