不使用Enum.partition在Elixir中快速排序

不使用Enum.partition在Elixir中快速排序,elixir,quicksort,Elixir,Quicksort,是否可以不使用Enum.partition构建快速排序?我使用一个过滤器实现了这段代码,但是我在列表中遍历了两次,以得到另外两个。有人能给我演示一下如何在单子上走一次吗 defmodule QuickSort do def sort([]) do [] end def sort(l) do [head | tail] = l {l1, l2} = partition(head, tail) sort(l1) ++ [head] ++ sort(l2)

是否可以不使用Enum.partition构建快速排序?我使用一个过滤器实现了这段代码,但是我在列表中遍历了两次,以得到另外两个。有人能给我演示一下如何在单子上走一次吗

defmodule QuickSort do
  def sort([]) do
    []
  end
  def sort(l) do
    [head | tail] = l
    {l1, l2} = partition(head, tail)
    sort(l1) ++ [head] ++ sort(l2)
  end
  def partition(pivot, rest) do
    lesser = Enum.filter(rest, fn(x) -> x < pivot end)
    greater = Enum.filter(rest, fn(x) -> x >= pivot end)

    {lesser, greater}
 end                                                                           
end 
defmodule快速排序do
def排序([])do
[]
结束
def排序(l)do
[头|尾]=l
{l1,l2}=分区(头,尾)
排序(l1)+[head]++sort(l2)
结束
def分区(枢轴、静止)do
lesser=枚举过滤器(剩余,fn(x)->x<轴端)
更大=枚举过滤器(其余,fn(x)->x>=枢轴端)
{小,大}
结束
结束

您不能仅使用
枚举过滤器/2
来完成此操作。这可以通过如下方式使用
Enum.reduce/2
完成:

list = [9, 7, 6, 8, 7, 3, 2, 1, 6]
pivot = 6
{lesser, greater} = Enum.reduce(list, {[], []}, fn x, {lesser, greater} ->
  if x < pivot do
    {[x | lesser], greater}
  else
    {lesser, [x | greater]}
  end
end)

IO.inspect {lesser, greater}
但是我们基本上重新实现了
Enum.partition/2
(除了我们的列表是相反的)

{[1, 2, 3], [6, 7, 8, 6, 7, 9]}