我对Erlang QuickSort实现有疑问:
qsort([]) -> [];
qsort([Pivot|T]) -> qsort([X || X <- T, X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T, X >= Pivot]).
上面的代码来自一本名为 Erlang Programming 的书,我不明白为什么第二个函数有一个代码片段X >= Pivot
。当函数的这一部分中间已经有>=
时,为什么>
而不是++[Pivot]++
?
答案 0 :(得分:3)
[Pivot]
基本上将单个元素Pivot
放入列表中,以便与其他2个列表连接。它不会考虑输入中具有相同值的其他元素。因此,您需要在实现的左侧或右侧处理它,以确保在返回排序列表时不会遗漏这些值。
e.g。假设你的输入列表是[5,3,6,5,2,7]。您需要处理三个子列表:
但是你输入的第二个“5”呢?它没有出现在上面的任何一个子列表中,所以当你将它们组合起来得到排序列表时,它就不再存在了!现在,如果您要修改子列表2或3以检查相等性,您将获得新的子列表[3,2,5]或[6,5,7],确保考虑输入中的所有元素。请注意,它是对称的,因此您可以在左侧使用“&lt; =”而不是在示例中使用右侧的“&gt; =”。