二分查找(Scheme)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章