Functional programming 有没有更好的方法在ocaml中实现快速排序?

Functional programming 有没有更好的方法在ocaml中实现快速排序?,functional-programming,ocaml,Functional Programming,Ocaml,我在OCaml中实现了快速排序。代码如下: 首先,我认为可能有更好的方法来实现分区。我想到了List.partition,但我只想自己实现关键部分 第二,我在排序中使用了@很多,这是低效的,对吗 有什么建议吗 编辑 需要考虑的另一个问题是,三向快速排序是否会影响OCaml中的实现?p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾 更重要的是,它不需要将列表的元组作为参数,使用两个单独的curried参数在语法上会更轻松。您

我在OCaml中实现了快速排序。代码如下:

首先,我认为可能有更好的方法来实现分区。我想到了List.partition,但我只想自己实现关键部分

第二,我在排序中使用了@很多,这是低效的,对吗

有什么建议吗

编辑

需要考虑的另一个问题是,三向快速排序是否会影响OCaml中的实现?

p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾

更重要的是,它不需要将列表的元组作为参数,使用两个单独的curried参数在语法上会更轻松。您还可以使用标准库的List.partition函数。

p函数缩进严重;说到缩进,我倾向于认为在下一行有一个in的风格对于单行声明来说是过分的,所以我宁愿把它们放在单行声明的末尾


更重要的是,它不需要将列表的元组作为参数,使用两个单独的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;;