Erlang中的QuickSort示例

时间:2015-12-09 02:07:40

标签: erlang

我对Erlang QuickSort实现有疑问:

qsort([]) -> [];
qsort([Pivot|T]) -> qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).

上面的代码来自一本名为 Erlang Programming 的书,我不明白为什么第二个函数有一个代码片段X >= Pivot。当函数的这一部分中间已经有>=时,为什么>而不是++[Pivot]++

1 个答案:

答案 0 :(得分:3)

[Pivot]基本上将单个元素Pivot放入列表中,以便与其他2个列表连接。它不会考虑输入中具有相同值的其他元素。因此,您需要在实现的左侧或右侧处理它,以确保在返回排序列表时不会遗漏这些值。

e.g。假设你的输入列表是[5,3,6,5,2,7]。您需要处理三个子列表:

  1. [Pivot] = [5]
  2. [X || X&lt; -T,X&lt; Pivot] = [3,2]
  3. [X || X&lt; -T,X&gt; Pivot] = [6,7]
  4. 但是你输入的第二个“5”呢?它没有出现在上面的任何一个子列表中,所以当你将它们组合起来得到排序列表时,它就不再存在了!现在,如果您要修改子列表2或3以检查相等性,您将获得新的子列表[3,2,5]或[6,5,7],确保考虑输入中的所有元素。请注意,它是对称的,因此您可以在左侧使用“&lt; =”而不是在示例中使用右侧的“&gt; =”。