pub mod search;
pub mod sort;
pub use sort::*;
pub mod digraph;
pub mod graph;
pub use digraph::bellman_for_sp;
pub use search::boyer_moore;
pub use search::kmp;
pub use search::rabin_karp;
pub use search::red_black_search;
pub use string::nfa;
#[macro_export]
macro_rules! fill_vec_with {
($vec:expr,$x:expr, $count:expr) => {
for _ in 0..$count {
$vec.push($x);
}
};
}
#[macro_export]
macro_rules! generate_vec_with {
($x:expr, $count:expr) => {{
let mut vec = Vec::with_capacity($count);
$crate::fill_vec_with!(vec, $x, $count);
vec
}};
}
#[cfg(test)]
mod tests {
use rand::{self, seq::SliceRandom};
use crate::sort;
#[test]
fn heap_sort() {
let mut data = set_up();
sort::heap_sort(&mut data);
assert!(is_sorted(&data), "merge sort failed");
}
#[test]
fn merge_sort() {
let mut data = set_up();
sort::merge_sort(&mut data);
assert!(is_sorted(&data), "merge sort failed");
}
#[test]
fn quick_sort_for_three_direction() {
let mut data = set_up();
let len = data.len() - 1;
sort::quick_sort_for_three_direction(&mut data, 0, len);
assert!(is_sorted(&data), "quick sort failed");
}
#[test]
fn quick_sort() {
let mut data = set_up();
let len = data.len() - 1;
sort::quick_sort(&mut data, 0, len);
assert!(is_sorted(&data), "quick sort failed");
}
#[test]
fn shell_sort() {
let mut data = set_up();
sort::shell_sort(&mut data);
assert!(is_sorted(&data), "shell sort failed");
}
#[test]
fn insert_sort() {
let mut data = set_up();
sort::insert_sort(&mut data);
assert!(is_sorted(&data), "insert sort failed");
}
#[test]
fn bubble_sort() {
let mut data = set_up();
sort::bubble_sort(&mut data);
assert!(is_sorted(&data), "bubble sort failed");
}
fn set_up() -> Vec<i32> {
let mut data: Vec<i32> = (1..10000).collect();
let mut rng = rand::thread_rng();
data.shuffle(&mut rng);
data
}
fn is_sorted(data: &[i32]) -> bool {
let mut ans = true;
let sential = data.len() - 1;
for i in 0..sential {
if data[i + 1] < data[i] {
ans = false;
break;
}
}
ans
}
}