O(nk)
입니다. 여기서 n
은 정렬할 요소의 수, k
는 숫자의 최대 자릿수입니다. k
가 상대적으로 작을 때, 기수 정렬은 매우 빠르게 작동할 수 있습니다. O(n + k)
입니다. extension Array where Element == Int {
public mutating func radixSort() {
let base = 10
var done = false
var digits = 1
while !done {
done = true
var buckets: [[Int]] = .init(repeating: [], count: base)
forEach { number in
let remainingPart = number / digits
let digit = remainingPart % base
buckets[digit].append(number)
if remianingPart > 0 {
done = false
}
}
print("\(digits): \(buckets)")
digits *= base
self = buckets.flatMap { $0 }
}
}
}
base
: 기수 정렬에서 사용되는 기수(10 진수)를 나타냅니다. done
: 정렬이 완료되었는지 여부를 나타내는 변수입니다. digits
: 현재 처리 중인 자릿수를 나타냅니다. while
루프는 모든 자릿수에 대해 정렬이 완료될 때까지 계속됩니다. buckets
배열이 초기화됩니다. buckets
배열을 flatMap
을 사용하여 평탄화하고, 이를 원래 배열에 다시 할당합니다. digits
를 base
로 곱하여 다음 자릿수로 넘어갑니다. done
은 false
로 유지되고, 다음 자릿수에 대한 정렬이 진행됩니다. var array = [88,410,1772,20]
array.radixSort()
print()
var array2 = [4,3,2,1]
array2.radixSort()
1: [[410, 20], [], [1772], [], [], [], [], [], [88], []]
10: [[], [410], [20], [], [], [], [], [1772], [88], []]
100: [[20, 88], [], [], [], [410], [], [], [1772], [], []]
1000: [[20, 88, 410], [1772], [], [], [], [], [], [], [], []]
10000: [[20, 88, 410, 1772], [], [], [], [], [], [], [], [], []]
1: [[], [1], [2], [3], [4], [], [], [], [], []]
10: [[1, 2, 3, 4], [], [], [], [], [], [], [], [], []]
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.