1use super::Sortable;
2
3pub fn sort<T: Sortable>(list: &mut [T]) {
23 let merged = merge_sort(list);
25 let mut merged_iter = merged.iter();
26 for v in list.iter_mut() {
27 *v = *merged_iter.next()
28 .expect("merge list length does not match input list length, should never happen");
29 }
30}
31
32fn merge_sort<T: Sortable>(list: &mut [T]) -> Vec<T> {
33 let len = list.len();
34 if len <= 1 {
35 return list.to_vec();
36 }
37 let mid = len /2;
38 let mut left = merge_sort(&mut list[..mid]);
39 let mut right = merge_sort(&mut list[mid..]);
40
41 merge(&mut left, &mut right)
42}
43
44fn merge<T:Sortable>(left: &mut [T], right: &mut [T]) -> Vec<T> {
45 let mut list = Vec::with_capacity(left.len() + right.len());
46 let mut left_iter = left.iter().peekable();
47 let mut right_iter = right.iter().peekable();
48 loop {
49 match (left_iter.peek(), right_iter.peek()) {
50 (None, None) => break,
51 (Some(&&l), None) => {
52 list.push(l);
53 left_iter.next();
54 },
55 (None, Some(&&r)) => {
56 list.push(r);
57 right_iter.next();
58 },
59 (Some(&&l), Some(&&r)) => {
60 if l < r {
61 list.push(l);
62 left_iter.next();
63 } else {
64 list.push(r);
65 right_iter.next();
66 }
67 },
68 }
69 }
70 list
71}