Я хотел бы знать, как написать эффективную версию быстрой сортировки , где список разбивается за один проход.
У меня есть этот фрагмент кода,
let rec quicksort' = function
[] -> []
| x::xs -> let small = List.filter (fun y -> y < x ) xs
and large = List.filter (fun y -> y > x ) xs
in quicksort' small @ (x :: quicksort' large);;
но здесь я просматриваю список более 1 раза (вызывая 2 раза быструю сортировку по маленькому и большому).
Идея состоит в том, чтобы сделать это за всего один шаг, не переходя к списку более 1 раза.