
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], [], [], [], [], [], [], [], [], []]
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.