March 2014 update

This commit is contained in:
Ingy döt Net 2014-04-02 16:56:35 +00:00
parent 09687c4926
commit a25938f123
1846 changed files with 21876 additions and 5203 deletions

View file

@ -1,7 +1,20 @@
:- module merge_sort.
:- interface.
:- import_module list.
:- type split_error ---> split_error.
:- func merge_sort(list(T)) = list(T).
:- pred merge_sort(list(T)::in, list(T)::out) is det.
:- implementation.
:- import_module int, exception.
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.
@ -11,7 +24,7 @@ merge_sort(L, U, S) :-
( split(H, U, F, B) ->
merge_sort(H, F, SF),
merge_sort(L - H, B, SB),
merge(SF, SB, S)
merge_sort.merge(SF, SB, S)
; throw(split_error) )
; S = U ).
@ -26,8 +39,8 @@ 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] ).
( compare(>, X, Y) ->
merge_sort.merge([X|Xs], Ys, M0),
M = [Y|M0]
; merge_sort.merge(Xs, [Y|Ys], M0),
M = [X|M0] ).