Erlang中的合并排序和快速排序不起作用

Erlang中的合并排序和快速排序不起作用,erlang,Erlang,有人能帮我找出我的排序算法出了什么问题吗。我没有错误,但陷入了某种无限循环。这些功能似乎是单独工作的 msort([])-> []; msort(L)-> {L3, L4} = msplit(L, [],[]), merge(msort(L3), msort(L4)). msplit([], L1, L2)-> {L1, L2}; msplit([H|[]], L1, L2)-> msplit([], [H]++L1, L2);

有人能帮我找出我的排序算法出了什么问题吗。我没有错误,但陷入了某种无限循环。这些功能似乎是单独工作的

msort([])->
    [];
msort(L)->
    {L3, L4} =  msplit(L, [],[]),
    merge(msort(L3), msort(L4)).

msplit([], L1, L2)->
    {L1, L2};
msplit([H|[]], L1, L2)->
    msplit([], [H]++L1, L2);
msplit([H|[H2|T]], A, B)->
    msplit(T, A++[H], B++[H2]).

merge(L, [])->L;
merge([], R)->R;
merge([H1|T1], [H2|T2])-> 
    if H1 < H2
         -> [H1|merge(T1, [H2|T2])];
       true-> [H2|merge([H1|T1], T2)] 
    end.

qsort([])->[];
qsort([H|T])-> 
    {A, B} =qsplit(T, H, [], []),
    Small =qsort(A),
    Large = qsort(B),
    lists:append(Small,Large).

qsplit([], H, A, B)->
    {A++[H], B};
qsplit([H|T], P, A, B)->
    if H > P->
           qsplit(T, P, A++[H], B);
       true-> qsplit(T, P, A, B++[H])
    end.
msort([])->
[];
msort(L)->
{L3,L4}=msplit(L,[],[]),
合并(msort(L3),msort(L4))。
msplit([],L1,L2)->
{L1,L2};
msplit([H |[]),L1,L2)->
msplit([],[H]++L1,L2);
msplit([H |[H2 | T]],A,B)->
msplit(T,A++[H],B++[H2])。
合并(L,[])->L;
合并([],R)->R;
合并([H1|T1],[H2|T2])->
如果H1

[H1 |合并(T1[H2 | T2]); true->[H2 |合并([H1 | T1],T2)] 结束。 qsort([])->[]; qsort([H|T])-> {A,B}=qsplit(T,H,[],[]), 小=qsort(A), 大=qsort(B), 列表:追加(小、大)。 qsplit([],H,A,B)-> {A++[H],B}; qsplit([H | T],P,A,B)-> 如果H>P-> qsplit(T,P,A++[H],B); true->qsplit(T,P,A,B++[H]) 结束。

经过一些更改后,代码工作正常:

msort([]) ->
        [];
msort([_] = L) ->
    L;
msort(L)->
    {L3, L4} =  msplit(L, [],[]),
    merge(msort(L3), msort(L4)).

msplit([], L1, L2)->
    {L1, L2};
msplit([H|[]], L1, L2)->
    msplit([], [H|L1], L2);
msplit([H|[H2|T]], A, B)->
    msplit(T, [H|A], [H2|B]).

merge(L, [])->L;
merge([], R)->R;
merge([H1|T1], [H2|T2])-> 
    if H1 < H2
         -> [H1|merge(T1, [H2|T2])];
       true-> [H2|merge([H1|T1], T2)] 
    end.

qsort([])->[];
qsort([_] = L)->L;
qsort([H|T])-> 
    {A, B} =qsplit(T, H, [], []),
    Large =qsort(A),
    Small = qsort(B),
    lists:append(Small,[H|Large]).

qsplit([], _, A, B)->
    {A, B};
qsplit([H|T], P, A, B)->
    if H > P->
           qsplit(T, P, [H|A], B);
       true-> qsplit(T, P, A, [H|B])
    end.
msort([])->
[];
msort([\u]=L)->
L
msort(L)->
{L3,L4}=msplit(L,[],[]),
合并(msort(L3),msort(L4))。
msplit([],L1,L2)->
{L1,L2};
msplit([H |[]),L1,L2)->
msplit([],[H | L1],L2);
msplit([H |[H2 | T]],A,B)->
msplit(T[H | A],[H2 | B])。
合并(L,[])->L;
合并([],R)->R;
合并([H1|T1],[H2|T2])->
如果H1

[H1 |合并(T1[H2 | T2]); true->[H2 |合并([H1 | T1],T2)] 结束。 qsort([])->[]; qsort([[u]=L)->L; qsort([H|T])-> {A,B}=qsplit(T,H,[],[]), 大=qsort(A), 小=qsort(B), 列表:追加(小、[H|大])。 qsplit([],[u],A,B)-> {A,B}; qsplit([H | T],P,A,B)-> 如果H>P-> qsplit(T,P,[H | A],B); true->qsplit(T,P,A[H | B]) 结束。

如果调用
msort/1
时,列表中只包含一项
[X]
您的
msplit/1
将返回
{[X],]}
,其中调用
msort/1
,其中包含一项
[X]
,依此类推。您可以通过添加
msort/1
function子句来修复它:

msort([])->
    [];
msort([_] = L) ->
    L;
msort(L)->
...
类似的问题也出现在
qsort/1


代码中还有更多问题。您应该将所有
A++[H]
替换为
[H]++A
,后者更适合写成
[H | A]
。它对代码的效率有很大的影响。您可以使用
[H,H2 | T]
而不是
[H |[H2 | T]
,这是一种很好的语法糖分,有助于可读性。

我知道是这样的,谢谢!是的,我将处理复杂性和句法以及!