all tasks
This commit is contained in:
parent
b83f433714
commit
68f8f3e56b
14735 changed files with 178959 additions and 0 deletions
|
|
@ -0,0 +1,33 @@
|
|||
:- func merge_sort(list(T)) = list(T).
|
||||
merge_sort(U) = S :- merge_sort(U, S).
|
||||
|
||||
:- pred merge_sort(list(T)::in, list(T)::out) is det.
|
||||
merge_sort(U, S) :- merge_sort(list.length(U), U, S).
|
||||
|
||||
:- pred merge_sort(int::in, list(T)::in, list(T)::out) is det.
|
||||
merge_sort(L, U, S) :-
|
||||
( L > 1 ->
|
||||
H = L // 2,
|
||||
( split(H, U, F, B) ->
|
||||
merge_sort(H, F, SF),
|
||||
merge_sort(L - H, B, SB),
|
||||
merge(SF, SB, S)
|
||||
; throw(split_error) )
|
||||
; S = U ).
|
||||
|
||||
:- pred split(int::in, list(T)::in, list(T)::out, list(T)::out) is semidet.
|
||||
split(N, L, S, E) :-
|
||||
( N = 0 -> S = [], E = L
|
||||
; N > 0, L = [H | L1], S = [H | S1],
|
||||
split(N - 1, L1, S1, E) ).
|
||||
|
||||
:- pred merge(list(T)::in, list(T)::in, list(T)::out) is det.
|
||||
merge([], [], []).
|
||||
merge([X|Xs], [], [X|Xs]).
|
||||
merge([], [Y|Ys], [Y|Ys]).
|
||||
merge([X|Xs], [Y|Ys], M) :-
|
||||
( compare(>, A, B) ->
|
||||
merge([X|Xs], Ys, M0),
|
||||
C = [Y|C0]
|
||||
; merge(Xs, [Y|Ys], C0),
|
||||
C = [X|C0] ).
|
||||
Loading…
Add table
Add a link
Reference in a new issue