pub fn merge_sort(list: &[i32]) -> Result<Vec<i32>,String> {
if list.is_empty() {
return Err("Cannot use merge sort on an empty list!".to_string());
}
let n = list.len();
if n == 1 {
return Ok(list.to_vec());
}
let mid = n / 2;
let left = merge_sort(&list[..mid])?;
let right = merge_sort(&list[mid..])?;
Ok(_merge(left,right))
}
fn _merge(left: Vec<i32>,right: Vec<i32>) -> Vec<i32> {
let mut merged = Vec::with_capacity(left.len() + right.len());
let (mut i, mut j) = (0,0);
while i < left.len() && j < right.len() {
if left[i] <= right[j] {
merged.push(left[i]);
i += 1;
} else {
merged.push(right[j]);
j += 1;
}
}
merged.extend_from_slice(&left[i..]);
merged.extend_from_slice(&right[j..]);
merged
}