\ Binary Search by Charles Melice \ When the key is not found, returns the position of the nearest greater key. \ Can be used to insert a new key in the sorted array. \ BSEARCH ( key array count -- index flag ) \ count count of elements in array. \ array SORTED array of anything. \ key the key we are searching for. \ flag TRUE if key was found. \ index effective else virtual key position in array. \ and, to define please: \ DEFER GET-KEY ( index array -- key ) \ array sorted array of anything. \ index index \ key the value at array[index] \ DEFER B-COMPARE ( key1 key2 -- result ) \ if key1 < key2, return -1 \ if key1 > key2, return +1 \ else return 0. [UNDEFINED] BSEARCH [IF] DEFER GET-KEY ( index array -- key ) DEFER B-COMPARE ( key1 key2 -- result ) : BSEARCH ( key array count -- index flag ) SWAP >R ( key count)( R: array) 0 SWAP ( key lo hi) BEGIN 2DUP < WHILE DUP >R >R OVER OVER R> -ROT R> + 2/ TUCK ( . . . mid key mid) R@ GET-KEY B-COMPARE ( . . . mid flag) 0> IF 1+ ROT DROP SWAP \ mid 1+ to lo ELSE NIP \ mid to hi THEN REPEAT ( key lo hi) NIP TUCK ( index key index) R> GET-KEY B-COMPARE 0= ; [THEN]