To understand how this works, try passing the list '(3 7 6 1 5 2 4) into mergesort and trace the mergesort function. You can do this by using:
(require (lib "trace.ss"))
in DrScheme and then, after copying and pasting in the mergesort code, do:
(trace mergesort)
Below is a fully functional mergesort in Scheme:
(define (mergesort l)
(cond ((< (length l) 2) l)
(else (merge (mergesort (partition1 l))
(mergesort (partition2 l))))))
(define (merge l1 l2)
(cond ((null? l1) l2)
((null? l2) l1)
((< (car l1) (car l2))
(cons (car l1) (merge (cdr l1) l2)))
(else (cons (car l2) (merge l1 (cdr l2))))))
(define (partition1 l)
(let ((num-elements (round (/ (length l) 2))))
(define (part counter l)
(cond ((= counter num-elements) '())
(else (cons (car l) (part (+ counter 1) (cdr l))))))
(part 0 l)))
(define (partition2 l)
(let ((num-elements (round (/ (length l) 2))))
(define (part counter l)
(cond ((= counter num-elements) l)
(else (part (+ counter 1) (cdr l)))))
(part 0 l)))