1234567891011121314151617181920212223242526272829303132333435 |
- ;;; The sort package -- binary search -*- Scheme -*-
- ;;; Copyright (c) 1998 by Olin Shivers.
- ;;; This code is in the public domain.
- ;;; Olin Shivers 98/11
- ;;; Returns the index of the matching element.
- ;;; (vector-binary-search < car 4 '#((1 . one) (3 . three)
- ;;; (4 . four) (25 . twenty-five)))
- ;;; => 2
- (define (vector-binary-search key< elt->key key v . maybe-start+end)
- (call-with-values
- (lambda () (vector-start+end v maybe-start+end))
- (lambda (start end)
- (let lp ((left start) (right end)) ; Search V[left,right).
- (and (< left right)
- (let* ((m (quotient (+ left right) 2))
- (elt (vector-ref v m))
- (elt-key (elt->key elt)))
- (cond ((key< key elt-key) (lp left m))
- ((key< elt-key key) (lp (+ m 1) right))
- (else m))))))))
- (define (vector-binary-search3 compare v . maybe-start+end)
- (call-with-values
- (lambda () (vector-start+end v maybe-start+end))
- (lambda (start end)
- (let lp ((left start) (right end)) ; Search V[left,right).
- (and (< left right)
- (let* ((m (quotient (+ left right) 2))
- (sign (compare (vector-ref v m))))
- (cond ((> sign 0) (lp left m))
- ((< sign 0) (lp (+ m 1) right))
- (else m))))))))
|