Skip to content

Instantly share code, notes, and snippets.

@kieraneglin
Created October 11, 2018 04:29
Show Gist options
  • Save kieraneglin/f0d9749b221a6f2dabd8ec41fcad803c to your computer and use it in GitHub Desktop.
Save kieraneglin/f0d9749b221a6f2dabd8ec41fcad803c to your computer and use it in GitHub Desktop.
extern crate rand;
use rand::Rng;
use std::time::Instant;
fn merge(l1: &Vec<i32>, s: usize, m: usize, e: usize, l2: &mut Vec<i32>) {
let mut ptr1 = s;
let mut ptr2 = m;
for i in s..e {
if (ptr1 < m) && (ptr2 >= e || l1[ptr1] <= l1[ptr2]) {
l2[i] = l1[ptr1];
ptr1 += 1;
} else {
l2[i] = l1[ptr2];
ptr2 += 1;
}
}
}
fn merge_copy(l1: &mut Vec<i32>, s: usize, e: usize, l2: &Vec<i32>) {
(s..e).for_each(|i| l1[i] = l2[i]);
}
fn merge_split(l1: &mut Vec<i32>, s: usize, e: usize, l2: &mut Vec<i32>) {
if e - s > 1 {
let m: usize = (e + s) / 2;
merge_split(l1, s, m, l2);
merge_split(l1, m, e, l2);
merge(l1, s, m, e, l2);
merge_copy(l1, s, e, l2);
}
}
pub fn merge_sort(l: &mut Vec<i32>) {
let size: usize = l.len();
let mut worker: Vec<i32> = vec![0; size];
merge_split(l, 0, size, &mut worker);
}
fn main() {
let mut rng = rand::thread_rng();
let mut numbers: Vec<i32> = (0..1000000).map(|_| {
rng.gen_range(1, 1000000)
}).collect();
let start = Instant::now();
merge_sort(&mut numbers);
let elapsed = start.elapsed();
println!("{}", numbers[0]);
println!("{:?}", elapsed);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment