#[cfg(test)]
mod tests {
use crate::{insertion_sort, insertion_sort_cmp};
#[test]
fn sort() {
let mut data = vec![5, 4, 3, 2, 1];
insertion_sort(&mut data);
assert_eq!(data, [1, 2, 3, 4, 5]);
}
#[test]
fn sort_cmp() {
let mut data = vec![5, 4, 3, 2, 1];
insertion_sort_cmp(&mut data, |a, b| {
if a > b {
1
} else if a < b {
-1
} else {
0
}
});
assert_eq!(data, [1, 2, 3, 4, 5]);
}
}
pub fn insertion_sort<T: PartialOrd>(v: &mut [T]) {
for i in 1..=v.len() {
let mut j = i - 1;
while j > 0 && v[j - 1] > v[j] {
v.swap(j - 1, j);
j -= 1;
}
}
}
pub fn insertion_sort_cmp<T, F>(v: &mut [T], f: F)
where
F: Fn(&T, &T) -> isize,
{
for i in 1..=v.len() {
let mut j = i - 1;
while j > 0 && f(&v[j - 1], &v[j]) > 0 {
v.swap(j - 1, j);
j -= 1;
}
}
}