Skip to content

Commit 0987c4a

Browse files
author
quintanamo
committed
add merge sort
1 parent bc505ce commit 0987c4a

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
lines changed

src/main.rs

+2
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@ fn main() {
1717
let contents: String = fs::read_to_string(input_file_path)
1818
.expect("File not specified.");
1919
let numbers: Vec<i32> = contents.split_whitespace().map(|s: &str| s.parse().unwrap()).collect();
20+
let numbers_len: usize = numbers.len();
2021

2122
let result: Vec<i32>;
2223
match algorithm.as_str() {
2324
"insertion-sort" => result = sorting::insertion_sort(numbers),
25+
"merge-sort" => result = sorting::merge_sort(numbers, 0, numbers_len - 1),
2426
_ => result = Vec::new()
2527
}
2628

src/sorting.rs

+75-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
1+
/*
2+
3+
INSERTION SORT
4+
5+
*/
16
pub fn insertion_sort(input: Vec<i32>) -> Vec<i32> {
27
let mut sorted: Vec<i32> = input;
3-
48
for j in 1..sorted.len() {
59
let key: i32 = sorted[j];
610
let mut i: usize = j;
@@ -10,10 +14,70 @@ pub fn insertion_sort(input: Vec<i32>) -> Vec<i32> {
1014
}
1115
sorted[i] = key;
1216
}
17+
return sorted;
18+
}
19+
20+
/*
21+
22+
MERGE SORT
1323
24+
*/
25+
pub fn merge_sort(input: Vec<i32>, left: usize, right: usize) -> Vec<i32> {
26+
let mut sorted: Vec<i32> = input;
27+
if left < right {
28+
let middle: usize = left + (right - left) / 2;
29+
sorted = merge_sort(sorted, left, middle);
30+
sorted = merge_sort(sorted, middle + 1, right);
31+
sorted = merge(sorted, left, middle, right);
32+
}
1433
return sorted;
1534
}
1635

36+
fn merge(input: Vec<i32>, left: usize, middle: usize, right: usize) -> Vec<i32> {
37+
let mut sorted: Vec<i32> = input;
38+
let n1: usize = middle - left + 1;
39+
let n2: usize = right - middle;
40+
let mut left_vec: Vec<i32> = vec![-1; n1];
41+
let mut right_vec: Vec<i32> = vec![-1; n2];
42+
for i in 0..n1 {
43+
left_vec[i] = sorted[left + i];
44+
}
45+
for j in 0..n2 {
46+
right_vec[j] = sorted[middle + j + 1];
47+
}
48+
let mut i: usize = 0;
49+
let mut j: usize = 0;
50+
let mut k: usize = left;
51+
while i < n1 && j < n2 {
52+
if left_vec[i] <= right_vec[j] {
53+
sorted[k] = left_vec[i];
54+
i = i + 1;
55+
} else {
56+
sorted[k] = right_vec[j];
57+
j = j + 1;
58+
}
59+
k = k + 1;
60+
}
61+
while i < n1 {
62+
sorted[k] = left_vec[i];
63+
i = i + 1;
64+
k = k + 1;
65+
}
66+
while j < n2 {
67+
sorted[k] = right_vec[j];
68+
j = j + 1;
69+
k = k + 1;
70+
}
71+
return sorted;
72+
}
73+
74+
/*
75+
76+
UTILITY FUNCTIONS
77+
78+
*/
79+
// function only used to validate if inputs are sorted
80+
#[allow(dead_code)]
1781
fn is_sorted(input: Vec<i32>) -> bool {
1882
let mut last_num = 0;
1983
for num in input {
@@ -28,6 +92,7 @@ fn is_sorted(input: Vec<i32>) -> bool {
2892
#[cfg(test)]
2993
mod tests {
3094
use super::insertion_sort;
95+
use super::merge_sort;
3196
use super::is_sorted;
3297

3398
const INPUTS: [[i32; 5]; 5] = [[1, 2, 3, 4, 5], [5, 4, 3, 2, 1], [1, 1, 1, 2, 3], [5, 1, 4, 2, 3], [5, 1, 2, 5, 5]];
@@ -47,4 +112,13 @@ mod tests {
47112
assert_eq!(is_sorted(sorted), true);
48113
}
49114
}
115+
116+
#[test]
117+
fn test_merge_sort() {
118+
for i in 0..INPUTS.len() {
119+
let sorted: Vec<i32> = merge_sort(INPUTS[i].to_vec(), 0, INPUTS[i].len() - 1);
120+
println!("{sorted:?}");
121+
assert_eq!(is_sorted(sorted), true);
122+
}
123+
}
50124
}

0 commit comments

Comments
 (0)