Rust 一次简单的快排

1,422 阅读1分钟

主要思路来源于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
  1. 这里规定a的类型为Ord 参数为[a] 返回值为[a]
  2. 当匹配到参数为空数组时直接返回[]
  3. 匹配到数组时,数组的第一个元素为x,后续元素为数组xs
  4. smaller = 数组xs中比x的小的元素的数组
  5. bigger = 数组xs中比x的大的元素的数组
  6. 递归求值,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
    // 可惜没有这种语法 quick_sort(&smaller) + vec![point] + quick_sort(&bigger)
}
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]);
}