erlang - 运行快速排序后可以输出列表长度吗?

时间:2017-03-26 11:08:49

标签: erlang quicksort

我是Erlang的新手。我一直在对随机的数字列表进行快速排序(我还有它只保留唯一的数字,因此重复项不会出现在排序列表中)。它工作得很好,因为输出给出了没有重复的排序数字,但我一直试图让它不仅输出列表,而且还输出长度列表,这也是我遇到错误的地方。

length(mod:func).将在erlang shell中给出列表的长度没有问题,但是在快速排序的递归之后我无法让它工作。我尝试过分配变量并执行lists:append。我只是不知道我做错了什么。

任何人都可以解释一下吗?

抱歉,我忘了附上以下代码。这是基本的快速排序。

-module(list).
-export([sort/0]).
-export([sort/1]).

sort() -> sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).

sort([]) -> [];

sort([Pivot|Tail]) ->  

    sort([ X || X <- Tail, X < Pivot]) ++

    [Pivot] ++

    sort([ X || X <- Tail, X > Pivot]).

当我在shell中运行它时,列表很好。如果我运行长度函数,它会给出9这就是我想要的。

55> c(list).    
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
57> length(list:sort()).
9

但是我试图让它只做list:sort(),然后立即给出列表和列表的长度。我尝试了很多不同的东西,我试图查找它,但似乎无法找到如何将两者合并在一起工作。看起来长度BIF是非常直接的功能,我只是没有以正确的方式使用/推进它。那有意义吗?

我希望这样说:

55> c(list).    
{ok,list}
56> list:sort().
[1,2,3,4,5,6,9,10,11]
The length of the list is 9

2 个答案:

答案 0 :(得分:1)

您可以使用io:format/2打印列表长度。只需要修改sort / 0函数就可以为它添加一行:

 sort() -> 
     Sorted = sort([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]),
     io:format("~p~nThe length of the list is ~w~n", [Sorted, length(Sorted)]).

答案 1 :(得分:1)

1> S = fun S([]) -> {[],0};                 
1> S([P|T]) ->                              
1> {Small,LSmall} = S([X || X <- T, X < P]),
1> {Big,LBig}= S([X || X <- T, X > P]),     
1> {Small ++ [P] ++ Big, LSmall+LBig+1}     
1> end.                                     
#Fun<erl_eval.30.52032458>
2> S([3,3,3,4,1,2,3,2,6,5,9,11,3,10,5]).
{[1,2,3,4,5,6,9,10,11],9}
3>