MergeSort

๋‹ค์Œ์œผ๋กœ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort)์„ ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ๊ฐ์„ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

fun mergeSort(arr: IntArray): IntArray {
    if (arr.size <= 1) {
        return arr
    }

    val middle = arr.size / 2
    val left = arr.sliceArray(0 until middle)
    val right = arr.sliceArray(middle until arr.size)

    return merge(mergeSort(left), mergeSort(right))
}

fun merge(left: IntArray, right: IntArray): IntArray {
    var leftIndex = 0
    var rightIndex = 0
    val result = IntArray(left.size + right.size)

    for (i in result.indices) {
        if (rightIndex >= right.size || (leftIndex < left.size && left[leftIndex] <= right[rightIndex])) {
            result[i] = left[leftIndex]
            leftIndex++
        } else {
            result[i] = right[rightIndex]
            rightIndex++
        }
    }

    return result
}

fun main() {
    val arr = intArrayOf(38, 27, 43, 3, 9, 82, 10)
    val sortedArray = mergeSort(arr)
    println(sortedArray.joinToString(", "))
}

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ๊ฐ์„ ์ •๋ ฌ.

  2. ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ํ›„, ๋‘ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉ.

  3. ๋ณ‘ํ•ฉํ•  ๋•Œ๋Š” ๋‘ ๋ฐฐ์—ด์˜ ์•ž๋ถ€๋ถ„๋ถ€ํ„ฐ ๋น„๊ตํ•˜์—ฌ ์ž‘์€ ๊ฐ’์„ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ๋„ฃ๊ณ , ๋‚˜๋จธ์ง€๋ฅผ ๋’ค์— ๋ถ™์ž…๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ O(n log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์•ˆ์ •์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

Last updated