sorting_algorithm/
heap_sort.rs

1/// Sorts a data set using Heap Sort
2///
3/// Average time complexity: O(n logn)
4///
5/// # Examples
6///
7/// ```
8/// use sorting_algorithm::heap_sort;
9///
10/// fn main() {
11///     let mut data = [3, 1, 2, 5, 4];
12///     
13///     heap_sort::sort(&mut data);
14///
15///     assert_eq!(data, [1, 2, 3, 4, 5]);
16/// }
17/// ```
18pub fn sort<T: Ord>(data: &mut [T]) {
19    let n = data.len();
20
21    if n <= 1 {
22        return;
23    }
24
25    for i in (0..n / 2).rev() {
26        heapify(data, i);
27    }
28
29    for i in (1..n).rev() {
30        data.swap(0, i);
31
32        heapify(&mut data[..i], 0);
33    }
34}
35
36fn heapify<T: Ord>(data: &mut [T], root: usize) {
37    let n = data.len();
38
39    let mut largest = root;
40
41    let left = 2 * root + 1;
42    let right = 2 * root + 2;
43
44    if left < n && data[left] > data[largest] {
45        largest = left;
46    }
47
48    if right < n && data[right] > data[largest] {
49        largest = right;
50    }
51
52    if largest != root {
53        data.swap(root, largest);
54
55        heapify(data, largest);
56    }
57}