; 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))))