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
ますよね?
助言がありますか?
編集
考えるべきもう 1 つの質問は3-way quicksort
、OCaml での実装に影響するかどうかです。