Skip to content

Commit 387f689

Browse files
author
quintanamo
committed
implement heap sort
1 parent dbb119c commit 387f689

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ This repo is just a few various algorithms I implemented in Rust to get some pra
55
#### Sorting Algorithms:
66
- Insertion Sort
77
- Merge Sort
8+
- Heap Sort

src/main.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ fn main() {
2323
match algorithm.as_str() {
2424
"insertion-sort" => result = sorting::insertion_sort(numbers),
2525
"merge-sort" => result = sorting::merge_sort(numbers, 0, numbers_len - 1),
26+
"heap-sort" => result = sorting::heap_sort(numbers),
2627
_ => result = Vec::new()
2728
}
2829

src/sorting.rs

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,46 @@ fn merge(input: Vec<i32>, left: usize, middle: usize, right: usize) -> Vec<i32>
7171
return sorted;
7272
}
7373

74+
/*
75+
76+
MERGE SORT
77+
78+
*/
79+
pub fn heap_sort(input: Vec<i32>) -> Vec<i32> {
80+
let mut sorted: Vec<i32> = input;
81+
let input_len: usize = sorted.len();
82+
for i in (0..((input_len/2))).rev() {
83+
sorted = heapify(sorted, input_len, i);
84+
}
85+
for i in (1..(input_len)).rev() {
86+
let temp = sorted[0];
87+
sorted[0] = sorted[i];
88+
sorted[i] = temp;
89+
sorted = heapify(sorted, i, 0);
90+
}
91+
return sorted;
92+
}
93+
94+
fn heapify(input: Vec<i32>, len: usize, i: usize) -> Vec<i32> {
95+
let mut heap: Vec<i32> = input;
96+
let mut largest: usize = i;
97+
let left_index: usize = 2 * i + 1;
98+
let right_index: usize = 2 * i + 2;
99+
if left_index < len && heap[left_index] > heap[largest] {
100+
largest = left_index;
101+
}
102+
if right_index < len && heap[right_index] > heap[largest] {
103+
largest = right_index;
104+
}
105+
if largest != i {
106+
let temp: i32 = heap[i];
107+
heap[i] = heap[largest];
108+
heap[largest] = temp;
109+
return heapify(heap, len, largest);
110+
}
111+
return heap;
112+
}
113+
74114
/*
75115
76116
UTILITY FUNCTIONS
@@ -91,6 +131,8 @@ fn is_sorted(input: Vec<i32>) -> bool {
91131

92132
#[cfg(test)]
93133
mod tests {
134+
use crate::sorting::heap_sort;
135+
94136
use super::insertion_sort;
95137
use super::merge_sort;
96138
use super::is_sorted;
@@ -117,7 +159,14 @@ mod tests {
117159
fn test_merge_sort() {
118160
for i in 0..INPUTS.len() {
119161
let sorted: Vec<i32> = merge_sort(INPUTS[i].to_vec(), 0, INPUTS[i].len() - 1);
120-
println!("{sorted:?}");
162+
assert_eq!(is_sorted(sorted), true);
163+
}
164+
}
165+
166+
#[test]
167+
fn test_heap_sort() {
168+
for i in 0..INPUTS.len() {
169+
let sorted: Vec<i32> = heap_sort(INPUTS[i].to_vec());
121170
assert_eq!(is_sorted(sorted), true);
122171
}
123172
}

0 commit comments

Comments
 (0)