; wave sorting

(define (wave-sort-and-twiddle xs)
  (let loop ((xs (sort xs <)) (zs (list)))
    (cond ((null? xs) (reverse zs))
          ((null? (cdr xs)) (reverse (cons (car xs) zs)))
          (else (loop (cddr xs) (cons (car xs) (cons (cadr xs) zs)))))))

(display (wave-sort-and-twiddle '(8 7 3 10 0 4 13 9 11 2))) (newline)

(define (wave-bubble xs)
  (let loop ((xs xs) (dir 1) (zs (list)))
    (cond ((null? xs) (reverse zs))
          ((null? (cdr xs))
            (reverse (cons (car xs) zs)))
          ((positive? (* dir (- (car xs) (cadr xs))))
            (loop (cdr xs) (- dir)
                  (cons (car xs) zs)))
          (else (loop (cons (car xs) (cddr xs))
                      (- dir) (cons (cadr xs) zs))))))

(display (wave-bubble '(8 7 3 10 0 4 13 9 11 2))) (newline)