Functional programming 有没有更简单的方法在OCaml中实现非就地选择排序?

Functional programming 有没有更简单的方法在OCaml中实现非就地选择排序?,functional-programming,ocaml,Functional Programming,Ocaml,我在OCaml中实现了一个非就地版本的选择排序 我的想法是,在一个列表中,每次我找到最小项列表(如果存在重复值)并将此min list添加到结果列表中,然后在列表的其余部分中重复查找 我使用List.filter过滤掉min\u列表,因此生成的列表将是下一个find\u min的列表 我发现我的实现相当复杂,比选择排序的Java就地版本复杂得多 有什么改进建议吗?编辑:这里有一个更好的实现: 这是我自己的垃圾实现 (* partial function - bad habit, don't

我在OCaml中实现了一个
非就地
版本的选择排序



我的想法是,在一个列表中,每次我找到最小项列表(如果存在重复值)并将此
min list
添加到结果列表中,然后在列表的其余部分中重复查找

我使用
List.filter
过滤掉
min\u列表
,因此生成的列表将是下一个
find\u min
的列表

我发现我的实现相当复杂,比选择排序的Java就地版本复杂得多


有什么改进建议吗?

编辑:这里有一个更好的实现:

这是我自己的垃圾实现

(* partial function - bad habit, don't do this. *)
let smallest (x::xs) = List.fold_right (fun e acc -> min e acc) xs x

let remove l y =
  let rec loop acc = function
    | [] -> raise Not_found
    | x::xs -> if y = x then (List.rev acc) @ xs else loop (x::acc) xs
  in loop [] l

let selection_sort = 
  let rec loop acc = function
    | [] -> List.rev acc
    | xs -> 
        let small = smallest xs in
        let rest = remove xs small in
        loop (small::acc) rest
  in loop [] 

你可以开始看到一个很好的网站,我不知道。我在做
选择排序
,而不是
插入排序
。但是你的建议实际上很好。我应该开始考虑方便的apiby
不使用
使用
?您暗示了插入排序的答案:D。接下来我将实现插入排序
(* partial function - bad habit, don't do this. *)
let smallest (x::xs) = List.fold_right (fun e acc -> min e acc) xs x

let remove l y =
  let rec loop acc = function
    | [] -> raise Not_found
    | x::xs -> if y = x then (List.rev acc) @ xs else loop (x::acc) xs
  in loop [] l

let selection_sort = 
  let rec loop acc = function
    | [] -> List.rev acc
    | xs -> 
        let small = smallest xs in
        let rest = remove xs small in
        loop (small::acc) rest
  in loop []