(define mergesort
(lambda (lst)
(cond ((null? lst) '()) ; first base case
((null? (cdr lst)) lst) ; second base case
(else (merge (mergesort (one-part lst))
(mergesort (the-other-part lst)))))))
(define merge
(lambda (lst1 lst2)
(cond ((null? lst1) lst2)
((null? lst2) lst1)
((< (car lst1) (car lst2)) (cons (car lst1)
(merge (cdr lst1) lst2)))
((< (car lst2) (car lst1)) (cons (car lst2)
(merge lst1 (cdr lst2))))
(else (cons (car lst1) (merge (cdr lst1) (cdr lst2)))))))
(define odd-part
(lambda (lst)
(if (null? lst)
'()
(cons (car lst) (even-part (cdr lst))))))
(define even-part
(lambda (lst)
(if (null? lst)
'()
(odd-part (cdr lst)))))
(define one-part odd-part)
(define the-other-part even-part)
(mergesort '(6 2 3 8 5 4 1 7)) ⇒ (1 2 3 4 5 6 7 8)