cogitate 0.2.0

Algorithms made in Rust
Documentation
pub fn selection_sort<T: Ord>(arr: &mut [T]) {
  let length = arr.len();

  for i in 0..length {
    let mut min_index = i;

    for j in (i + 1)..length {
      if arr[j] < arr[min_index] {
        min_index = j;
      }
    }

    if min_index != i {
      arr.swap(i, min_index);
    }
  }
}

#[cfg(test)]
mod tests {
  use super::*;

  #[test]
  fn test_empty_array() {
    let mut arr: Vec<i32> = vec![];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![]);
  }

  #[test]
  fn test_single_element() {
    let mut arr = vec![1];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![1]);
  }

  #[test]
  fn test_sorted_array() {
    let mut arr = vec![1, 2, 3, 4, 5];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![1, 2, 3, 4, 5]);
  }

  #[test]
  fn test_reverse_sorted_array() {
    let mut arr = vec![5, 4, 3, 2, 1];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![1, 2, 3, 4, 5]);
  }

  #[test]
  fn test_unsorted_array() {
    let mut arr = vec![64, 25, 12, 22, 11];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![11, 12, 22, 25, 64]);
  }

  #[test]
  fn test_duplicates() {
    let mut arr = vec![3, 3, 2, 1, 1];
    selection_sort(&mut arr);
    assert_eq!(arr, vec![1, 1, 2, 3, 3]);
  }
}