1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/// Sorts a slice in-place using
/// [selction sort](https://en.wikipedia.org/wiki/Selection_sort).
///
/// # Examples
/// ```
/// let mut vec = vec![56, 32, 78, 16];
/// sorts::insertion_sort(&mut vec);
/// assert_eq!(vec, &[16, 32, 56, 78]);
/// ```
pub fn selection_sort<T: PartialOrd>(s: &mut [T]) {
    for i in 0..s.len() {
        let swap = {
            let mut min = &s[i];
            let mut min_index = i;
            for j in i + 1..s.len() {
                if s[j] < *min {
                    min = &s[j];
                    min_index = j;
                }
            }
            min_index
        };

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