use uniq_vec;
fn median_three<T: Ord>(vals: &mut [T]) {
let rand_idx = uniq_vec::new_vec(3, 1, vals.len());
let median =
if vals[rand_idx[0]] > vals[rand_idx[1]] &&
vals[rand_idx[0]] < vals[rand_idx[2]] {
rand_idx[0]
} else if vals[rand_idx[1]] > vals[rand_idx[0]] &&
vals[rand_idx[1]] < vals[rand_idx[2]] {
rand_idx[1]
} else {
rand_idx[2]
};
vals.swap(0, median);
}
fn partition<T: Ord>(array: &mut [T], left: usize, right: usize) -> usize{
let mut pivot = left;
for i in left+1..right+1 {
if array[i] <= array[left] {
pivot += 1;
array.swap(i, pivot);
}
}
array.swap(pivot, left);
let pivot = match pivot {
0 => 1,
_ => pivot
};
pivot
}
fn _quicksort<T: Ord>(array: &mut [T], left: usize, right: usize) {
if left >= right {
return
}
let pivot_position = partition(array, left, right);
_quicksort(array, left, pivot_position -1);
_quicksort(array, pivot_position + 1, right)
}
pub fn quicksort<T: Ord>(unsorted_vec: &mut [T]) {
if unsorted_vec.len () <= 1 {
return
} else {
let right = unsorted_vec.len() - 1;
median_three(unsorted_vec);
_quicksort(unsorted_vec, 0, right);
}
}