1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
use std::cmp::Ordering; use std::cmp::Ordering::*; pub fn binary_search<T, F>(val: &T, slice: &[T], mut compare: F) -> Option<usize> where F: FnMut(&T, &T) -> Ordering, { let len = slice.len(); let mut start = 0usize; let mut end = len; let mut middle; while start < end { middle = start + (end - start) / 2; let current = &slice[middle]; match compare(val, current) { Greater => start = middle + 1, Less => end = middle, Equal => return Some(middle), } } return None; }