quicksort([], []).
quicksort(H.[], H.[]).
quicksort(H.T, S) :- partition(H, T, L, G),
                     quicksort(L, Ls),
                     quicksort(G, Gs),
                     append(Ls, H.[], Lsh),
                     append(Lsh, Gs, S).

partition(M, [], [], []).
partition(M, H.T, H.Lesser, Greater) :- H=<M,
                                        partition(M, T, Lesser, Greater).
partition(M, H.T, Lesser, H.Greater) :- M<H, 
                                        partition(M, T, Lesser, Greater).
append([], L, L).
append(H.T, L, H.A) :- append(T, L, A).
