/// Sorts a mutable slice in ascending order using merge sort. pub fn merge_sort(values: &mut [T]) { if values.len() <= 1 { return; } let middle = values.len() / 2; merge_sort(&mut values[..middle]); merge_sort(&mut values[middle..]); // Merge both sorted halves into a temporary buffer. let mut merged = Vec::with_capacity(values.len()); let (left, right) = values.split_at(middle); let (mut i, mut j) = (0, 0); while i < left.len() && j < right.len() { if left[i] <= right[j] { merged.push(left[i].clone()); i += 1; } else { merged.push(right[j].clone()); j += 1; } } merged.extend_from_slice(&left[i..]); merged.extend_from_slice(&right[j..]); values.clone_from_slice(&merged); } fn main() { let mut numbers = [8, 3, 5, 1, 9, 2]; merge_sort(&mut numbers); println!("{numbers:?}"); } #[cfg(test)] mod tests { use super::merge_sort; #[test] fn sorts_integers() { let mut values = [5, 2, 8, 2, 1, 9]; merge_sort(&mut values); assert_eq!(values, [1, 2, 2, 5, 8, 9]); } #[test] fn sorts_strings() { let mut values = vec!["pear", "apple", "orange"]; merge_sort(&mut values); assert_eq!(values, ["apple", "orange", "pear"]); } #[test] fn handles_empty_and_single_element_slices() { let mut empty: [i32; 0] = []; let mut single = [42]; merge_sort(&mut empty); merge_sort(&mut single); assert_eq!(empty, []); assert_eq!(single, [42]); } }