diff options
Diffstat (limited to 'bubble/bubble-sort.scm')
-rw-r--r-- | bubble/bubble-sort.scm | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/bubble/bubble-sort.scm b/bubble/bubble-sort.scm index 6efa819..fccaa4d 100644 --- a/bubble/bubble-sort.scm +++ b/bubble/bubble-sort.scm @@ -1,4 +1,35 @@ (define-module (bubble-sort)) (define-public (bubble-sort lst) - '()) + (vector->list (bubble-sort-helper (list->vector lst)))) + +(define (bubble-sort-helper vect) + "Recursively performs a bubble sort on VECT, +stopping only when no elements were swapped." + (let ((vect-old (vector-copy vect))) + (try-swap-all vect) + (if (equal? vect-old vect) + vect + (bubble-sort-helper vect)))) + +(define (try-swap-all vect) + "Performs a single iteration of the bubble sort +algorithm on VECT." + (do ((i 0 (1+ i))) + ((> i (- (vector-length vect) 2))) + (try-swap vect i (1+ i)))) + +(define (try-swap vect i j) + "Given two indices in ascending order, swap the +indices in VECT if the element at i is greater than +the element at j." + (cond + ((> i j) (error "Bad arguments passed to try-swap: i > j")) + ((> (vector-ref vect i) (vector-ref vect j)) (swap! vect i j)) + (else vect))) + +(define (swap! vect i j) + "Swap the ith and jth elements in VECT." + (let ((tmp (vector-ref vect i))) + (vector-set! vect i (vector-ref vect j)) + (vector-set! vect j tmp))) |