정렬되지 않은 배열로 가정하고, 오름차순으로 정렬 프로세스로 가정. → [4, 2, 6, 3, 7, 8, 5, 1]
분할
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]
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++]
}
}
indices
: IntRange
타입을 반환하며**,** 수신객체의 전체 범위 반환. 위 예제 에선 0..6until
: 범위의 마지막 요소를 포함하지 않음.
0..5
=> 0, 1, 2, 3, 4, 50 until 5
=> 0, 1, 2, 3, 4numbers.size
, numbers.lastIndex
을 주의해서 사용.