桶排序
(nums: &mut [T], hasher: F)
| 21 | |
| 22 | // 桶排序 |
| 23 | fn bucket_sort<H, T, F>(nums: &mut [T], hasher: F) |
| 24 | where H: Ord, |
| 25 | T: Ord + Clone + Debug, |
| 26 | F: Fn(&T) -> H, |
| 27 | { |
| 28 | // 准备多个桶 |
| 29 | let mut bks: Vec<Bucket<H, T>> = Vec::new(); |
| 30 | for val in nums.iter() { |
| 31 | let hasher = hasher(&val); |
| 32 | |
| 33 | // 数据入桶,对桶中数据二分搜索并排序 |
| 34 | match bks.binary_search_by(|bk| bk.hasher.cmp(&hasher)) { |
| 35 | Ok(idx) => bks[idx].values.push(val.clone()), |
| 36 | Err(idx) => bks.insert(idx, Bucket::new(hasher, val.clone())), |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | // 拆桶,将所有数据融合到一个 Vec |
| 41 | let ret = bks.into_iter().flat_map(|mut bk| { |
| 42 | bk.values.sort(); |
| 43 | bk.values |
| 44 | }).collect::<Vec<T>>(); |
| 45 | |
| 46 | // 将排序数据拷贝回 nums |
| 47 | nums.clone_from_slice(&ret); |
| 48 | } |
| 49 | |
| 50 | fn main() { |
| 51 | let mut nums = [0,54,32,99,18,75,31,43,4,56,21,22,1,100]; |