From 84a5d09b28e7fb7fb6d9766d052db9c415c1a8e2 Mon Sep 17 00:00:00 2001 From: Abey Bernard Date: Thu, 27 Jul 2023 12:20:34 +0530 Subject: [PATCH] Brief description of changes --- src/sorting/merge_sort.rs | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/sorting/merge_sort.rs b/src/sorting/merge_sort.rs index f17440f..441522b 100644 --- a/src/sorting/merge_sort.rs +++ b/src/sorting/merge_sort.rs @@ -7,32 +7,32 @@ pub fn merge_sort(array: &[T]) -> Vec { if array.len() < 2 { return array.to_vec(); } - // Get the middle element of the array. let middle = array.len() / 2; - // Divide the array into left and right halves. - let mut left = merge_sort(&array[..middle]); - let mut right = merge_sort(&array[middle..]); - // Call merge function using parameters as both left array and right array. - merge(&mut left, &mut right) + let left = merge_sort(&array[..middle]); + let right = merge_sort(&array[middle..]); + merge(&left, &right) } -fn merge(left: &mut Vec, right: &mut Vec) -> Vec { - let mut result = Vec::new(); - - for _ in 0..left.len() + right.len() { - if left.is_empty() { - result.append(right); - break; - } else if right.is_empty() { - result.append(left); - break; - } else if left[0] <= right[0] { - result.push(left.remove(0)); +fn merge(left: &[T], right: &[T]) -> Vec { + let mut result = Vec::with_capacity(left.len() + right.len()); + let mut left_iter = left.iter(); + let mut right_iter = right.iter(); + + let mut left_next = left_iter.next(); + let mut right_next = right_iter.next(); + + while let (Some(left_val), Some(right_val)) = (left_next, right_next) { + if left_val <= right_val { + result.push(*left_val); + left_next = left_iter.next(); } else { - result.push(right.remove(0)); + result.push(*right_val); + right_next = right_iter.next(); } } + result.extend(left_next); + result.extend(right_next); result }