use super::*;
pub struct Selection;
impl Sorter for Selection {
fn sort<T>(&self, slice: &mut [T])
where
T: Ord,
{
for unsorted in 0..slice.len() {
let min_rest = slice[unsorted..]
.iter()
.enumerate()
.min_by_key(|&(_, v)| v)
.map(|(i, _)| unsorted + i)
.expect("slice must be non-empty");
if unsorted != min_rest {
slice.swap(unsorted, min_rest);
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let mut items = vec![4, 2, 3, 1];
Selection.sort(&mut items);
assert_eq!(items, &[1, 2, 3, 4]);
}
}