다음으로 조금 더 복잡한 정렬 알고리즘인 병합 정렬 (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(", "))
}
병합 정렬은 O(n log n)의 시간 복잡도를 가지고 있으며, 안정적인 정렬 알고리즘입니다.