알고리즘

예시

정렬되지 않은 배열로 가정하고, 오름차순으로 정렬 프로세스로 가정. → [6, 5, 3, 1, 8, 7, 2, 4, 9]

      	 6
      /     \\
     5       3
   /   \\   /   \\
  1     8 7     2
 / \\
4   9
  1. 최대 힙 구조 만들기
	       9
      /     \\
     8       7
   /   \\   /   \\
  6     5 3     2
 / \\
1   4
  1. 정렬
	       **4**
      /     \\
     8       7
   /   \\   /   \\
  6     5 3     2
 / \\
1   **9**
	       8
      /     \\
     6       7
   /   \\   /   \\
  4     5 3     2
 / \\
1   9

소스코드 - Kotlin

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
}