don't stop believing

Heap Sort - 힙 정렬 본문

Golang/Basic

Heap Sort - 힙 정렬

Tongchun 2019. 5. 7. 15:01

Heap 자료구조를 이용한 정렬 방법입니다.

https://en.wikipedia.org/wiki/Heapsort

 

Heapsort - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search A sorting algorithm which uses the heap data structure In computer science, heapsort is a comparison-based sorting algorithm. Heapsort can be thought of as an improved selection sort:

en.wikipedia.org

먼저 Heap Sort를 이해하려면 Heap 자료구조와 완전이진트리에 대해 이해해야 합니다.
자세한 내용은 아래 글에서 확인하는 게 좋을 것 같습니다.

https://ratsgo.github.io/data%20structure&algorithm/2017/09/27/heapsort/

 

힙 정렬(Heap Sort) · ratsgo's blog

이번 글에서는 힙(heap)이라는 자료구조와 힙 정렬(Heap Sort) 알고리즘에 대해 살펴보도록 하겠습니다. 이 글은 고려대 김황남 교수님과 역시 같은 대학의 김선욱 교수님 강의와 위키피디아를 정리하였음을 먼저 밝힙니다. 파이썬 코드 구현은 이곳을 참고하였습니다. 그럼 시작하겠습니다. 힙은 큰 키(우선 순위)에 자주 액세스하거나 키(우선 순위) 중심으로 정렬된 시퀀스를 활용해야 할 때 유용한 자료구조입니다. 힙은 한 노드(node)가 최대 두 개의 자

ratsgo.github.io

Go로 구현된 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package main
import "fmt"
// heap .
func sift(arr []int, i int, arrLen int) []int {
done := false
maxChild := 0
for (i*2+1 < arrLen) && (!done) {
if i*2+1 == arrLen-1 {
maxChild = i*2 + 1
} else if arr[i*2+1] > arr[i*2+2] {
// .
maxChild = i*2 + 1
} else {
// .
maxChild = i*2 + 2
}
fmt.Println(i, maxChild)
if arr[i] < arr[maxChild] {
arr[i], arr[maxChild] = arr[maxChild], arr[i]
i = maxChild
} else {
done = true
}
}
return arr
}
func main() {
arr := []int{9, 1, 2, 8, 6, 7, 5, 3, 0, 4}
fmt.Println("Initial array is:", arr)
fmt.Println("")
i := 0
// () .
for i = len(arr)/2 - 1; i >= 0; i-- {
arr = sift(arr, i, len(arr))
}
// arr: [9 8 7 3 6 2 5 1 0 4]
// () heap(arr[0]) .
for i = len(arr) - 1; i >= 1; i-- {
arr[0], arr[i] = arr[i], arr[0]
arr = sift(arr, 0, i)
}
fmt.Println("Sorted array is: ", arr)
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

저는 heap 구조를 이해하기 위해 heap 구조를 배열로 변환된 것을 그려봤습니다.

배열을 완전이진트리로 변환되는 과정을 그리면 이해하기 편합니다.

 

'Golang > Basic' 카테고리의 다른 글

Shell Sort - 쉘 정렬  (0) 2019.05.09
Insertion Sort - 삽입 정렬  (0) 2019.05.08
Odd-Even Sort - 홀짝 정렬  (0) 2019.05.01
Comb Sort - 빗질 정렬  (0) 2019.04.29
Quick Sort - 퀵 정렬  (0) 2019.04.28
Comments