csbubble_sort/
lib.rs

1#![feature(is_sorted)]
2
3trait BubbleSort<T> {
4    fn bubble_sort(&mut self);
5    fn bubble_sort_by(&mut self, by: FnMustSwap<T>);
6}
7
8type FnMustSwap<T> = fn(a: &T, b: &T) -> bool;
9
10impl<T> BubbleSort<T> for Vec<T> where T: PartialOrd {
11    fn bubble_sort(&mut self) {
12        self.bubble_sort_by(|a, b| a > b)
13    }
14
15    fn bubble_sort_by(&mut self, by: FnMustSwap<T>) {
16        let mut stop = true;
17        for i in 0..self.len() {
18            for j in 0..(self.len() - i - 1) {
19                if by(&self[j], &self[j + 1]) {
20                    self.swap(j, j + 1);
21                    stop = false;
22                }
23            }
24            if stop {
25                break;
26            }
27            stop = true;
28        }
29    }
30}
31
32#[cfg(test)]
33mod test {
34    use crate::BubbleSort;
35
36    #[test]
37    fn test_bubble_sort() {
38        let mut input: Vec<u32> = vec![];
39        input.reverse();
40        input.bubble_sort();
41        assert!(input.is_sorted());
42
43        let mut input: Vec<u32> = vec![1];
44        input.reverse();
45        input.bubble_sort();
46        assert!(input.is_sorted());
47
48        let mut input: Vec<u32> = vec![2, 1];
49        input.reverse();
50        input.bubble_sort();
51        assert!(input.is_sorted());
52
53        let mut input: Vec<u32> = vec![0, 1, 2, 3];
54        input.reverse();
55        input.bubble_sort();
56        assert!(input.is_sorted());
57    }
58}