Advertisement
triclops200

MergeSort

Aug 7th, 2013
251
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 0.97 KB | None | 0 0
  1. (defun merge-lists (xs ys cmp)
  2.   (labels ((rec (xs ys acc)
  3.          (cond
  4.            ((and (null xs) (null ys))
  5.         acc)
  6.            ((null ys)
  7.         (append (reverse xs) acc))
  8.            ((null xs)
  9.         (rec ys xs acc))
  10.            ((funcall cmp (car ys) (car xs))
  11.         (rec xs (cdr ys) (cons (car ys) acc)))
  12.            (t
  13.         (rec ys (cdr xs) (cons (car xs) acc))))))
  14.     (nreverse (rec xs ys '()))))
  15. (defun split-list (xs)
  16.   (labels ((rec (xs acc)
  17.          (if (null xs)
  18.          acc
  19.          (rec (cdr xs) (cons (list (car xs)) acc)))))
  20.     (rec xs nil)))
  21. (defun merge-lists-by-two (xss cmp)
  22.   (labels ((rec (xss acc)
  23.          (if (cadr xss)
  24.          (rec (cddr xss)
  25.               (cons
  26.                (merge-lists (car xss) (cadr xss) cmp) acc))
  27.          (if (null xss)
  28.              acc
  29.              (cons (car xss) acc)))))
  30.     (rec xss '())))
  31. (defun merge-sort (xs &optional (cmp #'<=))
  32.   (labels ((rec (xss)
  33.        (if (cadr xss)
  34.            (rec (merge-lists-by-two xss cmp))
  35.            xss)))
  36.     (car (rec (split-list xs)))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement