Functional programming 有没有更好的方法在ocaml中实现快速排序?
我在OCaml中实现了快速排序。代码如下: 首先,我认为可能有更好的方法来实现分区。我想到了List.partition,但我只想自己实现关键部分 第二,我在排序中使用了@很多,这是低效的,对吗 有什么建议吗 编辑 需要考虑的另一个问题是,三向快速排序是否会影响OCaml中的实现?p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾 更重要的是,它不需要将列表的元组作为参数,使用两个单独的curried参数在语法上会更轻松。您还可以使用标准库的List.partition函数。p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾Functional programming 有没有更好的方法在ocaml中实现快速排序?,functional-programming,ocaml,Functional Programming,Ocaml,我在OCaml中实现了快速排序。代码如下: 首先,我认为可能有更好的方法来实现分区。我想到了List.partition,但我只想自己实现关键部分 第二,我在排序中使用了@很多,这是低效的,对吗 有什么建议吗 编辑 需要考虑的另一个问题是,三向快速排序是否会影响OCaml中的实现?p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾 更重要的是,它不需要将列表的元组作为参数,使用两个单独的curried参数在语法上会更轻松。您
更重要的是,它不需要将列表的元组作为参数,使用两个单独的curried参数在语法上会更轻松。您还可以使用标准库的List.partition函数。您可以尝试的一个微优化是执行List.concat[[qs left];[pivot];[qs right]]来立即追加列表,但您需要运行一些基准测试来验证这一点,甚至还有帮助。您可以尝试的一个微优化是执行List.concat[[qs left];[pivot];[qs right]]若要立即附加列表,您需要运行一些基准测试来验证这一点是否有帮助。对于它的价值,quicksort的亮点在于它如何利用底层可变数组表示。不清楚是否有理由将其用于列表。@JeffreyScofield哦,好的。我只是在练习我的OCaml技能。我认为ught我们应该避免使用数组,对吗?@JeffreyScofield还有,Array.length是O1还是On?Array.length是O1。你能告诉我为什么OCaml的列表使用MergeSort而不是quicksort吗?quicksort的优点在于它能很好地利用底层的可变数组表示。现在还不清楚有什么理由在列表中使用它@JeffreyScofield哦,好的。我只是想练习我的OCaml技能。我想我们应该避免使用数组,对吗?@JeffreyScofield还有,Array.length是O1或On?Array.length是O1。你能告诉我为什么OCaml的列表使用MergeSort而不是quicksort吗?如果你想玩这个游戏,你可以使用反向比较来进行左递归调用n函数,这样您就可以使用List.rev_append qs left pivot::qs right。如果您想玩这个游戏,可以让左递归调用使用反向比较函数,这样您就可以使用List.rev_append qs left pivot::qs right。
let shuffle d =
let nd = List.map (fun c -> (Random.bits (), c)) d in
let sond = List.sort compare nd in
List.map snd sond;;
let partition = function
| [] -> ([], [], [])
| pivot::tl ->
let rec p (left, right) = function
| [] -> (left, right, [pivot])
| first::rest ->
let c = compare pivot first
in
if c > 0 then
p (first::left, right) rest
else
p (left, first::right) rest
in
p ([], []) tl;;
let quicksort l =
let sl = shuffle l
in
let rec qs = function
| [] -> []
| l ->
let (left, right, pivot) = partition l
in
(qs left) @ pivot @ (qs right)
in
qs sl;;