pub fn quick_sort(list: &[i32]) -> Result<Vec<i32>,String> {
if list.is_empty() {
return Err("Cannot quick sort an empty array.".to_string());
}
let mut result = list.to_vec();
let len = result.len();
_quick_sort_recursive(&mut result, 0, len - 1);
Ok(result)
}
fn _quick_sort_recursive(array: &mut [i32], first: usize, last: usize) {
if first < last {
let pivot = _partition(array, first, last);
if pivot > 0 {
_quick_sort_recursive(array, first, pivot - 1);
}
_quick_sort_recursive(array, pivot + 1, last);
}
}
fn _partition(array: &mut [i32], first: usize, last: usize) -> usize {
let pivot_value = array[last];
let mut wall = first;
for pos in first..last {
if array[pos] < pivot_value {
array.swap(pos,wall);
wall += 1;
}
}
array.swap(wall, last);
wall
}