sorting_algorithm/
heap_sort.rs1pub 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}