二分查找(Scheme)

来源:互联网 发布:淘宝上日本代购哪家好 编辑:程序博客网 时间:2024/06/07 06:50
; Binary-search, 二分查找;======================================================================================(binary-search (vector 11 12 20 23 30 34) 23)  ; 3(define (binary-search v e)  (let search ((start 0)                (end (- (vector-length v) 1)))    (if (> start end)        -1        (let* ((mid (div (+ start end) 2))               (piv (vector-ref v mid)))          (cond            ((> e piv) (search (+ mid 1) end))            ((< e piv) (search start (- mid 1)))            (else mid))))))
(define vec      ; oop表示的vector    (lambda (n)        (let ((v (make-vector n)))            (lambda (i . m)                (if (null? m)                    (if (eqv? 'len i) n (vector-ref v i))                    (vector-set! v i (car m)))))))(define v (vec 10))
; ==========================================================================================================(define (pr v) ; 打印vector    (let p ((i 0))        (if (< i (v 'len))            (begin                (printf "~d, " (v i))                (p (+ 1 i))))))(let w ((i 0)) ; 初始化升序vector v    (if (< i (v 'len))        (begin (v i (* i 3)) (w (+ i 1)))))(pr v)
; ============================================================================================================(define binary-search2                                                 ; 对升序vector v 搜索x的坐标    (lambda (x v)        (let while ((low 0)                    (high (- (v 'len) 1)))            (if (<= low high)                (let ((mid (div (+ low high) 2)))                    (cond                        ((> x (v mid)) (while (+ 1 mid) high))                        ((< x (v mid)) (while low (- mid 1)))                                  (else mid)))                                                  -1))))

0 0