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}