정렬되지 않은 배열로 가정하고, 오름차순으로 정렬 프로세스로 가정. → [6, 5, 3, 1, 8, 7, 2, 4, 9]
6
/ \\
5 3
/ \\ / \\
1 8 7 2
/ \\
4 9
9
/ \\
8 7
/ \\ / \\
6 5 3 2
/ \\
1 4
**4**
/ \\
8 7
/ \\ / \\
6 5 3 2
/ \\
1 **9**
8
/ \\
6 7
/ \\ / \\
4 5 3 2
/ \\
1 9
fun main() {
val array = intArrayOf(4, 2, 6, 3, 7, 8, 5, 1)
heapSort(array)
}
fun heapify(array: IntArray, n: Int, i: Int) {
var p = i
val l = i * 2 + 1
val r = i * 2 + 2
if (l < n && array[p] < array[l]) {
p = l
}
if (r < n && array[p] < array[r]) {
p = r
}
if (i != p) {
swap(array, p, i)
heapify(array, n, p)
}
}
fun heapSort(array: IntArray) {
val n = array.size
// init, max heap
// 힙 구조는 O(n)번이면 만들 수 있음. 전체 개수의 반만 보면됨
// 그 이유는 절반의 노드 개수로도 힙 구조를 생성하기 때문임.
// 힙 구조를 충족하지 못할 경우엔, 부모 노드까지 타고 올라감.
for (i in n / 2 - 1 downTo 0) {
heapify(array, n, i)
}
// for extract max element from heap
for (i in n - 1 downTo 1) {
swap(array, 0, i)
heapify(array, i, 0)
}
}
fun swap(array: IntArray, a: Int, b: Int) {
val temp = array[a]
array[a] = array[b]
array[b] = temp
}