Есть какой-нибудь более простой способ реализовать сортировку выбора по месту в OCaml?
Я реализовалnon-in-place
версия выбора сортировки в OCaml.
let sort compare_fun l =
let rec find_min l' min_l origin_l =
match l' with
| [] ->
if min_l = [] then (min_l, l')
else
let min = List.hd min_l
in
(min_l, List.filter (fun x -> if x != min then true else false) origin_l)
| x::tl ->
if min_l = [] then
find_min tl [x] origin_l
else
let c = compare_fun (List.hd min_l) x
in
if c = 1 then
find_min tl [x] origin_l
else if c = 0 then
find_min tl (min_l @ [x]) origin_l
else
find_min tl min_l origin_l
in
let rec insert_min l' new_l =
match l' with
| [] -> new_l
| _ ->
let (min_l, rest) = find_min l' [] l'
in
insert_min rest (new_l @ min_l)
in
insert_min l [];;
Моя идея заключается в том, что в списке каждый раз, когда я нахожу список минимальных элементов (в случае дублированных значений) и добавляю этоmin list
к списку результатов, затем верните Find_min в остальной части списка.
я используюList.filter
отфильтроватьmin_list
, поэтому результирующий список будет списком для следующего.find_min
Я считаю, что моя реализация довольно сложна и намного сложнее, чем Java-версия выбора вида.
Есть предложения по улучшению?