我quicksort
在 OCaml 中实现。这是代码:
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;;
首先,我认为也许有更好的方法来实现分区。List.partition
我想到了,但我只是想自己实现关键部分
其次,我@
在排序中使用了很多,inefficient
对吧?
有什么建议么?
编辑
另一个需要考虑的问题是是否3-way quicksort
会影响 OCaml 中的实现?