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