previous | index

Mergesort Again

     (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)

previous | index