The merge-sort function on the previous page does not terminate for all lists of numbers. Identify an input for which it fails to terminate. Provide a fix so that it will terminate for all lists of numbers.

Hint: try some (small) hand evaluations.

Solution

merge-sort doesn't make progress for a list of numbers that only has one number in it. For example:

(merge-sort (list 1))
=(merge (merge-sort empty) (merge-sort (list 1)))
=(merge (merge-sort empty) (merge (merge-sort empty) (merge-sort (list 1))))
=...

 

To fix, add a case for a singleton list to merge-sort.

;; merge-sort : list-of-numbers -> list-of-numbers
(define (merge-sort l)
  (cond
    [(empty? l) empty]
    [(empty? (rest l)) l]
    [else
     (merge (merge-sort (evens l))
            (merge-sort (odds l)))]))