1pub mod search;
4pub mod sort;
5pub use sort::*;
6pub mod digraph;
7pub mod graph;
8pub use digraph::bellman_for_sp;
9pub use search::boyer_moore;
10pub use search::kmp;
11pub use search::rabin_karp;
12pub use search::red_black_search;
13pub use string::nfa;
14pub mod io;
15pub mod string;
16#[macro_export]
17macro_rules! fill_vec_with {
18 ($vec:expr,$x:expr, $count:expr) => {
20 for _ in 0..$count {
21 $vec.push($x);
22 }
23 };
24}
25#[macro_export]
27macro_rules! generate_vec_with {
28 ($x:expr, $count:expr) => {{
29 let mut vec = Vec::with_capacity($count);
30 $crate::fill_vec_with!(vec, $x, $count);
31 vec
32 }};
33}
34#[cfg(test)]
35mod tests {
36 use rand::{self, seq::SliceRandom};
38
39 use crate::sort;
40 #[test]
41 fn heap_sort() {
42 let mut data = set_up();
43 sort::heap_sort(&mut data);
45 assert!(is_sorted(&data), "merge sort failed");
47 }
49 #[test]
50 fn merge_sort() {
51 let mut data = set_up();
52 sort::merge_sort(&mut data);
54 assert!(is_sorted(&data), "merge sort failed");
56 }
58 #[test]
59 fn quick_sort_for_three_direction() {
60 let mut data = set_up();
61 let len = data.len() - 1;
63 sort::quick_sort_for_three_direction(&mut data, 0, len);
64 assert!(is_sorted(&data), "quick sort failed");
66 }
68 #[test]
69 fn quick_sort() {
70 let mut data = set_up();
71 let len = data.len() - 1;
73 sort::quick_sort(&mut data, 0, len);
74 assert!(is_sorted(&data), "quick sort failed");
76 }
78 #[test]
79 fn shell_sort() {
80 let mut data = set_up();
81 sort::shell_sort(&mut data);
82 assert!(is_sorted(&data), "shell sort failed");
84 }
86 #[test]
87 fn insert_sort() {
88 let mut data = set_up();
89 sort::insert_sort(&mut data);
90 assert!(is_sorted(&data), "insert sort failed");
92 }
94 #[test]
95 fn bubble_sort() {
96 let mut data = set_up();
97 sort::bubble_sort(&mut data);
98 assert!(is_sorted(&data), "bubble sort failed");
100 }
102
103 fn set_up() -> Vec<i32> {
104 let mut data: Vec<i32> = (1..10000).collect();
105 let mut rng = rand::thread_rng();
106 data.shuffle(&mut rng);
107 data
109 }
110 fn is_sorted(data: &[i32]) -> bool {
111 let mut ans = true;
112 let sential = data.len() - 1;
113 for i in 0..sential {
114 if data[i + 1] < data[i] {
116 ans = false;
117 break;
118 }
119 }
120 ans
121 }
122}