home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d09xx
/
d0963.lha
/
SIOD
/
scm
/
sort.scm
< prev
next >
Wrap
Text File
|
1993-06-18
|
3KB
|
63 lines
(define (sort! x . y)
(define test <=)
(define (interchange x i j)
(define tmp (vector-ref x i))
(vector-set! x i (vector-ref x j))
(vector-set! x j tmp))
(define (qsort x m n)
(if (< m n)
(do ((i m)
(j (1+ n))
(k (begin (interchange x
m
(quotient (+ m n)
2))
(vector-ref x m))))
((>= i j) (interchange x m j)
(qsort x m (-1+ j))
(qsort x (1+ j) n) x)
(set! i (1+ i))
(do ()
((or (test k (vector-ref x i))
(>= i n)))
(set! i (1+ i)))
(set! j (-1+ j))
(do ()
((or (test (vector-ref x j) k)
(<= j m)))
(set! j (-1+ j)))
(if (< i j)
(interchange x i j)))))
(define (m-s x y)
(define res (list 'dummy))
(do ((ptr res (cdr ptr))
(done #f))
(done (cdr res))
(cond ((null? x) (set-cdr! ptr y)
(set! done #t))
((null? y) (set-cdr! ptr x)
(set! done #t))
((test (car x) (car y))
(set-cdr! ptr x)
(set! x (cdr x)))
(else (set-cdr! ptr y)
(set! y (cdr y))))))
(define (mer-so x)
(if (or (null? x) (null? (cdr x)))
x
(m-s x
(mer-so (do ((ptr (cdr x) (cdr ptr))
(y (cddr x) (cdr y)))
((or (null? y)
(test (car y) (car ptr)))
(set-cdr! ptr nil) y))))))
(if (pair? y)
(if (proc? (car y))
(set! test (car y))
(error "second arg to sort! must be a procedure" (car y))))
(cond ((vector? x) (qsort x 0 (-1+ (vector-length x))) x)
((pair? x) (mer-so x))
(else (error "first arg to sort! must be a vector or a list" x))))