fn merge<T: Copy + PartialOrd>(x1: &[T], x2: &[T], y: &mut [T]) {
assert_eq!(x1.len() + x2.len(), y.len());
let mut a = 0;
let mut b = 0;
let mut c = 0;
while a < x1.len() && b < x2.len() {
if x1[a] < x2[b] {
y[c] = x1[a];
c += 1;
a += 1;
} else {
y[c] = x2[b];
c += 1;
b += 1;
}
}
if a < x1.len() {
y[c..].copy_from_slice(&x1[a..]);
}
if b < x2.len() {
y[c..].copy_from_slice(&x2[b..]);
}
}
fn merge_ordenado<T: Copy + Ord>(x: &mut [T]) {
let n = x.len();
let m = n / 2;
if n <= 1 {
return;
}
merge_ordenado(&mut x[0..m]);
merge_ordenado(&mut x[m..n]);
let mut y: Vec<T> = x.to_vec();
merge(&x[0..m], &x[m..n], &mut y[..]);
x.copy_from_slice(&y);
}
fn main() {
let mut arr = [6, 4, 2, 1, 5, 3];
println!("{:?}", arr);
merge_ordenado(&mut arr);
println!("{:?}\n", arr);
}