Skip to content

Instantly share code, notes, and snippets.

@Abraxos
Created July 5, 2016 05:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Abraxos/b733a57d1bc0d28a004b856295bf441d to your computer and use it in GitHub Desktop.
Save Abraxos/b733a57d1bc0d28a004b856295bf441d to your computer and use it in GitHub Desktop.
Mergesort implementation in Rust
fn merge_sort(to_sort: &Vec<i32>) -> Vec<i32>{
if to_sort.len() == 0 {
vec![]
} else if to_sort.len() == 1 {
vector_slice(to_sort,0,1)
} else {
let mid = to_sort.len() / 2;
let first = &vector_slice(to_sort, 0, mid);
let second = &vector_slice(to_sort, mid, to_sort.len());
let first = &merge_sort(first);
let second = &merge_sort(second);
let result = merge(first, second);
result
}
}
fn vector_slice(vec: &Vec<i32>, start: usize, end: usize) -> Vec<i32> {
let mut slice = Vec::with_capacity(vec.len());
for i in start..end {
slice.push(vec[i]);
}
slice
}
fn merge(a: &Vec<i32>, b: &Vec<i32>) -> Vec<i32>{
let mut c = Vec::with_capacity(a.len() + b.len());
let mut ai = 0;
let mut bi = 0;
loop {
if bi >= b.len() {
while ai < a.len() {
c.push(a[ai]);
ai += 1;
}
break;
}
if ai >= a.len() {
while bi < b.len() {
c.push(b[bi]);
bi += 1;
}
break;
}
if a[ai] <= b[bi] {
c.push(a[ai]);
ai += 1;
} else {
c.push(b[bi]);
bi += 1;
}
}
c
}
fn test_merge_vectors() {
let a = vec![1,3,5,7,9];
let b = vec![2,4,6,8,10,11,12,13];
let c = merge(&a, &b);
assert_eq!(c, [1,2,3,4,5,6,7,8,9,10,11,12,13]);
let a = vec![];
let b = vec![2,4,6,8,10,11,12,13];
let c = merge(&a, &b);
assert_eq!(c, [2,4,6,8,10,11,12,13]);
let a = vec![1,3,5,7,9];
let b = vec![];
let c = merge(&a, &b);
assert_eq!(c, [1,3,5,7,9]);
let a = vec![1];
let b = vec![2,4,6,8,10,11,12,13];
let c = merge(&a, &b);
assert_eq!(c, [1,2,4,6,8,10,11,12,13]);
let a = vec![];
let b = vec![];
let c = merge(&a, &b);
assert_eq!(c, []);
println!("All merging tests passed!");
}
fn test_merge_sort() {
let to_sort = &vec![];
assert_eq!(merge_sort(to_sort), vec![]);
let to_sort = &vec![1,2];
assert_eq!(merge_sort(to_sort), vec![1,2]);
let to_sort = &vec![2,1];
assert_eq!(merge_sort(to_sort), vec![1,2]);
let to_sort = &vec![1];
assert_eq!(merge_sort(to_sort), vec![1]);
let to_sort = &vec![6,5,3,1,8,7,2,4];
assert_eq!(merge_sort(to_sort), vec![1,2,3,4,5,6,7,8]);
let to_sort = &vec![6,5,3,1,8,7,2,4,9,10,11,12,13];
assert_eq!(merge_sort(to_sort), vec![1,2,3,4,5,6,7,8,9,10,11,12,13]);
println!("All sorting tests passed!");
}
fn main() {
println!("Merge Sort Test");
test_merge_vectors();
test_merge_sort();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment