(defun mergesort (li &optional (compare #'>)) (cond ((or (endp li) (endp (rest li))) li) (t (labels ((my-split (lis) (cond ((endp lis) (list nil nil)) ((endp (rest lis)) (list lis nil)) (t (let* ((fi (first lis)) (la (first (reverse (rest lis)))) (mi (reverse (rest (reverse (rest lis))))) (re (my-split mi))) (list (append (list fi) (first re)) (append (second re) (list la)))))))) (let* ((sp (my-split li)) (le (mergesort (first sp) compare)) (ri (mergesort (second sp) compare))) (merge 'list le ri compare))))))