rust-algorithms:12-基數排序

godme發表於2022-07-27

pub fn radix_sort(arr: &mut [u64]) {
    let max = match arr.iter().max() {
        Some(&v) => v as usize,
        None => return
    };
    // 基礎進位制
    let base = arr.len().next_power_of_two();
    // 截斷資料
    let mut truncate = 1;
    while truncate <= max {
        // 計算截斷後餘數,也就是基礎的排序(zu)
        let base_order_index = |x| x as usize / truncate % base;
        let mut orders = vec![0; base];
        // 統計排序
        for &v in arr.iter() {
            orders[base_order_index(v)] += 1;
        }
        // 傳播排序,整體排序序號為len,起始為1
        for i in 1..base {
            orders[i] += orders[i - 1];
        }
        // 倒排,根據位置直接填充
        for &v in arr.to_owned().iter().rev() {
            let index = base_order_index(v);
            orders[index] -= 1;
            arr[orders[index]] = v;
        }
        // 按照下一個位置進行截斷排序
        truncate *= base;
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章