sorting_rs/
bitonic_sort.rs1pub fn bitonic_sort<T: PartialOrd + Default + Clone>(input: &mut Vec<T>) {
37 if input.len() < 2 {return;}
38 else if input.len() > 9223372036854775808 {panic!("Array is too big")}
39
40 let in_len = input.len();
41
42 let mut add_len = 0;
44 println!("{}", add_len);
45
46 for (i, num) in crate::POWERS_OF_TWO.iter().enumerate() {
47 if in_len == *num {add_len = 0;}
48 if i > 0 {
49 if in_len < *num {if in_len > crate::POWERS_OF_TWO[i - 1] {
50 add_len = num - in_len;}
51 }
52 }
53 }
54
55 if add_len > 0 {
56 input.append(&mut vec![T::default(); add_len]);
57 }
58
59 bit_sort(input, true);
60 input.drain(..add_len);
61}
62
63
64fn bit_sort<T: PartialOrd>(input: &mut [T], mode: bool) {
65 if input.len() > 1 {
66 let mid_point = input.len() / 2;
67 bit_sort(&mut input[..mid_point], true);
68 bit_sort(&mut input[mid_point..], false);
69 sub_sort(input, mode);
70 }
71}
72fn sub_sort<T: PartialOrd>(input: &mut [T], mode: bool) {
73 if input.len() > 1 {
74 compare_and_swap(input, mode);
75 let mid_point = input.len() / 2;
76 sub_sort(&mut input[..mid_point], mode);
77 sub_sort(&mut input[mid_point..], mode);
78 }
79}
80fn compare_and_swap<T: PartialOrd>(input: &mut [T], mode: bool) {
81 let mid_point = input.len() / 2;
82 for i in 0..mid_point {
83 if (input[i] > input[mid_point + i]) == mode {
84 input.swap(i, mid_point + i);
85 }
86 }
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92
93 #[test]
94 fn test_bitonic_usize() {
95 let mut vector_in = vec![10, 20, 11, 24, 15];
96 bitonic_sort(&mut vector_in);
97 debug_assert_eq!(vector_in, vec![10, 11, 15, 20, 24]);
98 }
99 #[test]
100 fn test_bitonic_usize_pow_2() {
101 let mut vector_in = vec![10, 20, 11, 24, 15];
102 bitonic_sort(&mut vector_in);
103 debug_assert_eq!(vector_in, vec![10, 11, 15, 20, 24]);
104 }
105 #[test]
106 fn test_bitonic_bool() {
107 let mut vector_in = vec![false, true, false, false, true];
108 bitonic_sort(&mut vector_in);
109 debug_assert_eq!(vector_in, vec![false, false, false, true, true]);
110 }
111 #[test]
112 fn test_bitonic_char() {
113 let mut vector_in = vec!['r', 'u', 's', 't', 'c'];
114 bitonic_sort(&mut vector_in);
115 debug_assert_eq!(vector_in, vec!['c', 'r', 's', 't', 'u']);
116 }
117 #[test]
118 fn test_bitonic_empty() {
119 let mut vector_in:Vec<u8> = vec![];
120 bitonic_sort(&mut vector_in);
121 debug_assert_eq!(vector_in, vec![]);
122 }
123 #[test]
124 fn test_bitonic_len1() {
125 let mut vector_in = vec![1];
126 bitonic_sort(&mut vector_in);
127 debug_assert_eq!(vector_in, vec![1]);
128 }
129}