language: Erlang (erl-5.7.3)
date: 154 days 1 hour ago
link:
可見度: public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-module(prog).
-export([main/0]).
 
msort(Xs) -> mergesort(fun(X,Y) -> X < Y end,Xs).
 
halves(XS) -> split(XS,XS).
split([X|Xs],[_,_|Zs]) ->
    {Us,Vs} = split(Xs,Zs),
    {[X|Us],Vs};
split(Xs,_) -> {[],Xs}.
 
merge(_,Xs,[]) -> Xs;
merge(_,[],Ys) -> Ys;
merge(Pred,[X|Xs],[Y|Ys]) ->
    case Pred(X,Y) of
        true  -> [X|merge(Pred,Xs,[Y|Ys])];
        false -> [Y|merge(Pred,[X|Xs],Ys)]
    end.
 
mergesort(_,[]) -> [];
mergesort(_,[X]) -> [X];
mergesort(Pred,[X,Y]) ->
    case Pred(X,Y) of
        true -> [X,Y];
        false -> [Y,X]
    end;
mergesort(Pred,Xs) -> 
    {Ys,Zs} = halves(Xs),
    merge(Pred,mergesort(Pred,Ys),mergesort(Pred,Zs)).
 
main() -> 
    io:format("~p",[hd(msort(lists:seq(1000,-1000,-1)))]).