我需要对一个例子进行排序:
?- mergesort([8,1,[4,6,3],2],Sorted).
结果应该是:
Sorted = [1, 2, 8, [3, 4, 6]]
不幸的是我不确定该怎么做。我自己试图找到答案,但没有找到解决方案。目前的结果是:
Sorted = [1, 2, 8, [4, 6, 3]]
我的代码:
mergesort([],[]).
mergesort([A],[A]).
mergesort([A,B|R],S) :-
split([A,B|R],L1,L2),
mergesort(L1,S1),
mergesort(L2,S2),
merge(S1,S2,S).
split([],[],[]).
split([A],[A],[]).
split([A,B|R],[A|Ra],[B|Rb]) :- split(R,Ra,Rb).
merge(A,[],A).
merge([],B,B).
merge([A|Ra],[B|Rb],[A|M]) :- A @=< B, merge(Ra,[B|Rb],M).
merge([A|Ra],[B|Rb],[B|M]) :- A @> B, merge([A|Ra],Rb,M).
提前非常感谢!
答案 0 :(得分:0)
我会写一个简单的预处理步骤:
sortl([H|T],[Hs|Ts]) :-
( is_list(H)
-> mergesort(H,Gs),
sortl(Gs,Hs)
; Hs = H
),
sortl(T,Ts).
sortl([],[]).
然后你可以这样使用它
?- sortl([8,1,[4,6,[3,4],[1,8],3],2,[1,3,2]],T),mergesort(T,Sorted).
T = [8, 1, [3, 4, 6, [1, 8], [3|...]], 2, [1, 2, 3]],
Sorted = [1, 2, 8, [1, 2, 3], [3, 4, 6, [...|...]|...]]