bsort/
lib.rs

1pub fn bubble_sort<T>(array: &mut [T])
2where
3    T: PartialOrd,
4{
5    for i in 0..array.len() - 1 {
6        for j in (i + 1)..array.len() {
7            if array[j] < array[i] {
8                array.swap(i, j);
9            }
10        }
11    }
12}
13
14pub trait BubbleSort {
15    fn bubble_sort(&mut self);
16}
17
18impl<T: PartialOrd> BubbleSort for [T] {
19    fn bubble_sort(&mut self) {
20        bubble_sort(self)
21    }
22}
23
24#[cfg(test)]
25mod tests {
26    use super::BubbleSort as _;
27
28    #[test]
29    fn it_works_i8() {
30        let array: &mut [i8] = &mut [3, 1, 2];
31        array.bubble_sort();
32        assert_eq!(array, [1, 2, 3]);
33    }
34
35    #[test]
36    fn it_works_u8() {
37        let array: &mut [u8] = &mut [3, 1, 2];
38        array.bubble_sort();
39        assert_eq!(array, [1, 2, 3]);
40    }
41
42    #[test]
43    fn it_works_u8_vec() {
44        let mut array: Vec<u8> = vec![3, 1, 2];
45        array.bubble_sort();
46        assert_eq!(array, vec![1, 2, 3]);
47    }
48
49    #[test]
50    fn it_works_char_vec() {
51        let mut array: Vec<char> = vec!['🥚', '🐣', '🐔'];
52        array.bubble_sort();
53        assert_eq!(array, vec!['🐔', '🐣', '🥚']);
54    }
55
56    #[test]
57    fn it_works_str_vec() {
58        let mut array: Vec<&str> = vec!["DOT", "ETH", "BTC"];
59        array.bubble_sort();
60        assert_eq!(array, vec!["BTC", "DOT", "ETH"]);
61    }
62
63    #[test]
64    fn it_works_bool_vec() {
65        let mut array: Vec<bool> = vec![true, false];
66        array.bubble_sort();
67        assert_eq!(array, vec![false, true]);
68    }
69
70    #[test]
71    fn it_works_option_vec() {
72        let mut array: Vec<Option<()>> = vec![Some(()), None];
73        array.bubble_sort();
74        assert_eq!(array, vec![None, Some(())]);
75    }
76}