赞
踩
fn search<E: PartialOrd>(data: Vec<E>, target: E) -> i32 { let mut l: i32 = 0; // 左闭右开区间 let mut r = data.len() as i32; while l < r { let mid = l + (r - l) / 2; if data[mid as usize] == target { return mid; } if data[mid as usize] < target { l = mid + 1; } else { r = mid } } return -1; }
// 二分查找 fn search<E: PartialOrd>(data: Vec<E>, target: E) -> i32 { recursion_search(&data, 0, data.len() as i32 - 1, target) } // 递归调用 fn recursion_search<E: PartialOrd>(data: &Vec<E>, l: i32, r: i32, target: E) -> i32 { if l > r { return -1; } // 避免溢出 let mid = l + (r - l) / 2; if data[mid as usize] == target { return mid; } if data[mid as usize] < target { // 中间值小于目标,就在右边寻找 recursion_search(data, mid + 1, r, target) } else { // 中间值大于目标,就在左边寻找 // mid - 1,如果mid=0,-1使用usize就会溢出,所以参数使用i32 recursion_search(data, l, mid - 1, target) } } #[cfg(test)] mod tests { use crate::binary_search::search; #[test] fn it_works() { let data = vec![5]; assert_eq!(search(data, -5), -1); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。