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}