정렬되지 않은 배열로 가정하고, 오름차순으로 정렬 프로세스로 가정.
→ ****[170, 45, 75, 90, 802, 24, 2, 66]
170, 90, 2, 802, 24, 45, 75, 66
2, 802, 24, 45, 66, 170, 75, 90
[2, 24, 45, 66, 75, 90, 170, 802]
fun radixSort(arr: IntArray): IntArray {
val max = arr.maxOrNull() ?: return arr // 최댓값 찾기
var place = 1 // 자릿수
while (max / place > 0) { // 자릿수 별로 호출
countingSortByDigit(arr, place)
place *= 10
}
return arr
}
fun countingSortByDigit(arr: IntArray, place: Int) {
val output = IntArray(arr.size)
val count = IntArray(10)
// 자릿수 마다 발생 횟수 기록
for (i in arr.indices) {
val digit = (arr[i] / place) % 10
count[digit]++
}
// 누적 계수
for (i in 1..9) {
count[i] += count[i - 1]
}
// 정렬된 배열 생성
for (i in arr.size - 1 downTo 0) {
val digit = (arr[i] / place) % 10
output[count[digit] - 1] = arr[i]
count[digit]--
}
// 기존 배열 업데이트
for (i in arr.indices) {
arr[i] = output[i]
}
}
fun main() {
val arr = intArrayOf(170, 45, 75, 90, 802, 24, 2, 66)
println(radixSort(arr).joinToString(", "))
}
indices
: IntRange
타입을 반환하며**,** 수신객체의 전체 범위 반환. 위 예제 에선 0..6until
: 범위의 마지막 요소를 포함하지 않음.
0..5
=> 0, 1, 2, 3, 4, 50 until 5
=> 0, 1, 2, 3, 4numbers.size
, numbers.lastIndex
을 주의해서 사용.