MCPcopy Create free account
hub / github.com/QMHTMY/RustBook / bucket_sort

Function bucket_sort

publication/code/chapter07/bucket_sort.rs:23–48  ·  view source on GitHub ↗

桶排序

(nums: &mut [T], hasher: F)

Source from the content-addressed store, hash-verified

21
22// 桶排序
23fn 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
50fn main() {
51 let mut nums = [0,54,32,99,18,75,31,43,4,56,21,22,1,100];

Callers 1

mainFunction · 0.70

Calls 6

iterMethod · 0.45
cmpMethod · 0.45
pushMethod · 0.45
insertMethod · 0.45
into_iterMethod · 0.45
sortMethod · 0.45

Tested by

no test coverage detected