主要思路来源于Haskell的快排
1 quickSort :: (Ord a)=>[a]->[a]
2 quickSort [] =[]
3 quickSort (x:xs)=
4 let smaller=[a|a<-xs,a<=x]
5 bigger=[a|a<-xs,a>x]
6 in quickSort smaller ++[x]++quickSort bigger
- 这里规定a的类型为Ord 参数为[a] 返回值为[a]
- 当匹配到参数为空数组时直接返回[]
- 匹配到数组时,数组的第一个元素为x,后续元素为数组xs
- smaller = 数组xs中比x的小的元素的数组
- bigger = 数组xs中比x的大的元素的数组
- 递归求值,smaller数组的排序结果拼接上x再拼接上bigger数组的排序结果
rust
fn quick_sort(array_list:&Vec<i32>) -> Vec<i32>{
if array_list.len() == 0{
return vec![];
}
let point = array_list[0];
let smaller: Vec<i32> = array_list[1..].iter().filter(|s| **s <= point).cloned().collect();
let bigger: Vec<i32> = array_list[1..].iter().filter(|s| **s > point).cloned().collect();
let smaller = quick_sort(&smaller);
let bigger = quick_sort(&bigger);
let mut container = vec![];
container.extend(smaller);
container.extend(&vec![point]);
container.extend(bigger);
container
}
fn main() {
assert_eq!(quick_sort(&vec![9,2,1,2,5,6,7,10,8]),[1,2,2,5,6,7,8,9,10]);
assert_eq!(quick_sort(&vec![1,9,1,2,1,2,5,6,7,10,8]),[1,1,1,2,2,5,6,7,8,9,10]);
}