
insert(X,[],[X]).
insert(X,[Y|Ys],[X,Y|Ys]) :- X < Y.
insert(X,[Y|Ys],[Y|Zs]) :-
	X >= Y ,
	insert(X,Ys,Zs).

isort([],[]).
isort([X|Xs],Zs) :-
	isort(Xs,Ys),
	insert(X,Ys,Zs).

%% ----------------------------------------------------------------------

%% doesn't preserve order;
%% moves potential mins closer to the front
minandrem(X,[X],[]).
minandrem(M1,[X|Xs],[X|Ys]) :-
	minandrem(M1,Xs,Ys),
	M1 < X.
minandrem(X,[X|Xs],[M1|Ys]) :-
	minandrem(M1,Xs,Ys),
	M1 >= X.

ssort([],[]).
ssort(Xs,[Y|Zs]) :-
	minandrem(Y,Xs,Ys),
	ssort(Ys,Zs).

%% ----------------------------------------------------------------------

alllt(_,[],[]).
alllt(P,[X|Xs],[X|Ys]) :-
	X < P,
	alllt(P,Xs,Ys).
alllt(P,[X|Xs],Ys) :-
	X >= P,
	alllt(P,Xs,Ys).

allgte(_,[],[]).
allgte(P,[X|Xs],[X|Ys]) :-
	X >= P,
	allgte(P,Xs,Ys).
allgte(P,[X|Xs],Ys) :-
	X < P,
	allgte(P,Xs,Ys).

append([],Ys,Ys).
append([X|Xs],Ys,[X|Zs]) :-
	append(Xs,Ys,Zs).

qsort([],[]).
qsort([X|Xs],Ys) :-
	alllt(X,Xs,Xs1),
	qsort(Xs1,Xs1s),
	allgte(X,Xs,Xs2),
	qsort(Xs2,Xs2s),
	append(Xs1s,[X|Xs2s],Ys).
	
