알고리즘

예시

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

  1. 배열을 둘 로 나눔.
    1. 중간 인덱스 찾기
  2. 나눈 배열들의 원소가 2개 이하가 될 때 까지 나눔.
  3. 나눈 배열들을 정렬 후 나머지 배열들과 병합함.
분할
1. [4, 2, 6, 3, 7, 8, 5, 1]
2. [4, 2, 6, 3] [7, 8, 5, 1]
3. [4, 2] [6, 3] [7, 8] [5, 1]

정복
1. [2, 4] [3, 6] [7, 8] [1, 5]
2. [2, 3, 4, 6] [1, 5, 7, 8]
3. [1, 2, 3, 4, 5, 6, 7, 8]

소스코드 - Kotlin

fun main() {
    val intArray = intArrayOf(4, 2, 6, 3, 7, 8, 5, 1)
    println(mergeSort(intArray, 0, intArray.lastIndex))
}

fun mergeSort(array: IntArray, left: Int, right: Int) {
    if (left < right) {
        val mid = (left + right) / 2
        mergeSort(array, left, mid)
        mergeSort(array, mid + 1, right)
        merge(array, left, mid, right)
    }
}

fun merge(array: IntArray, left: Int, mid: Int, right: Int) {
    val L = array.copyOfRange(left, mid + 1)
    val R = array.copyOfRange(mid + 1, right + 1)

    var i = 0
    var j = 0
    var k = left
    val ll = L.size
    val rl = R.size
    while (i < ll && j < rl) {
        if (L[i] <= R[j]) {
            array[k] = L[i++]
        } else {
            array[k] = R[j++]
        }
        k++
    }

    while (i < ll) {
        array[k++] = L[i++]
    }
    while (j < rl) {
        array[k++] = R[j++]
    }
}

범위 및 함수 사용시 유의사항

장점