基数ソート radix sort
O(N logN
)
- バケットソートは巨大な数字が存在するとその分箱の数を用意する必要がある
- 基数ソートは各桁に対してバケットソートすることで最後にソートすることができる
// Number of Digits
const D: usize = 3_usize;
// Number of Elements of Array
const N: usize = 10_usize;
fn main() {
let mut a: [u32;N] = [123, 1, 11, 7, 215, 0, 24, 32, 27, 333];
radix_sort(&mut a);
println!("a = {:?}", a);
}
fn radix_sort(a: &mut [u32;N]) {
for i in 0..D {
let exp: usize = 10usize.pow(i as u32);
bucketsort(a, exp);
}
}
fn bucketsort(a: &mut [u32;N], exp: usize) {
// ソート後配列における値ごとの開始位置
let mut output = [0_u32; 10];
// 出現回数を求める
let mut count = [0_usize; 10];
// 出現回数を数える
for i in 0..N {
let index: usize = (a[i] as usize) / exp;
count[ index % 10 ] += 1;
}
// 開始位置計算
for i in 1..10 {
count[i] += count[i-1];
}
for i in (0..=N-1).rev() {
let index: usize = (a[i] as usize) / exp;
output[count[(index) % 10] - 1] = a[i];
count[ (index) % 10 ] -= 1;
}
for i in 0..N {
a[i] = output[i];
}
}