Stable divide-and-conquer sorting algorithm with O(n log n) complexity
fn merge_sort<T: Clone + Ord>(arr: &mut [T]) {
let len = arr.len();
if len <= 1 {
return;
}
let mid = len / 2;
let mut left = arr[0..mid].to_vec();
let mut right = arr[mid..].to_vec();
merge_sort(&mut left);
merge_sort(&mut right);
merge(&left, &right, arr);
}
fn merge<T: Clone + Ord>(left: &[T], right: &[T], result: &mut [T]) {
let mut i = 0;
let mut j = 0;
let mut k = 0;
while i < left.len() && j < right.len() {
if left[i] <= right[j] {
result[k] = left[i].clone();
i += 1;
} else {
result[k] = right[j].clone();
j += 1;
}
k += 1;
}
while i < left.len() {
result[k] = left[i].clone();
i += 1;
k += 1;
}
while j < right.len() {
result[k] = right[j].clone();
j += 1;
k += 1;
}
}
fn main() {
let mut numbers = vec![64, 34, 25, 12, 22, 11, 90, 5];
println!("Original array: {:?}", numbers);
merge_sort(&mut numbers);
println!("Sorted array: {:?}", numbers);
}
Views
Lines
Characters
Likes