; Split: input is a list of objects, output is a list of two lists of
; approximately equal size such that the set of all objects in both
; lists is the same as the set of objects in the input list.
(define split
(lambda (l)
(if (null? l)
(list '() '())
(if (null? (cdr l))
(list l '())
(let ((rest (split (cddr l))))
(list (cons (car l) (car rest))
(cons (car (cdr l))
(car (cdr rest)))))))))
; Merge: input is two lists of numbers in increasing order, output is
; a list of numbers in increasing order consisting of exactly those
; numbers in the input list.
(define merge
(lambda (l1 l2)
(if (null? l1)
l2
(if (null? l2)
l1
(if (< (car l1) (car l2))
(cons (car l1) (merge (cdr l1) l2))
(cons (car l2) (merge l1 (cdr l2))))))))
; Mergesort: input is a list of numbers, output is that list sorted
(define mrgsrt
(lambda (lst)
(if (null? lst)
'()
(if (null? (cdr lst))
lst
(let* ((s (split lst))
(a (car s))
(b (cadr s)))
(merge (mrgsrt a) (mrgsrt b)))))))


