implement recursive binary serach in rust (#93)
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
[[package]]
|
||||
name = "binary-search"
|
||||
version = "0.1.0"
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "binary-search"
|
||||
version = "0.1.0"
|
||||
authors = ["giorgiodelgado <hi@gdelgado.ca>"]
|
||||
|
||||
[dependencies]
|
||||
103
01_introduction_to_algorithms/rust/01_binary_search/src/main.rs
Normal file
103
01_introduction_to_algorithms/rust/01_binary_search/src/main.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
// to run tests, you must have rust and cargo installed
|
||||
// then run `cargo test`
|
||||
|
||||
use std::cmp;
|
||||
|
||||
// assumes that the slice is already sorted
|
||||
fn binary_search<T: cmp::PartialOrd>(lst: &[T], item: T) -> Option<usize> {
|
||||
let mid = ((lst.len() / 2) as f32).ceil() as usize;
|
||||
|
||||
match lst.get(mid) {
|
||||
None => None,
|
||||
Some(val) => {
|
||||
if *val == item {
|
||||
Some(mid)
|
||||
} else if *val > item {
|
||||
let sublist = &lst[..mid];
|
||||
binary_search(sublist, item)
|
||||
} else {
|
||||
let sublist = &lst[(mid + 1)..];
|
||||
// mapping is necessary when the item is
|
||||
// to the right of the middle since indices on the
|
||||
// sublist are erased and being at 0, 1, 2, 3, ... etc
|
||||
binary_search(sublist, item).map(|pos| pos + mid + 1)
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let num_slice = &[2, 4, 5, 12, 15, 30, 32, 33, 34, 40, 45, 51, 55, 57, 60, 66, 70, 71, 90, 99, 100];
|
||||
|
||||
let result = binary_search(num_slice, 70);
|
||||
|
||||
println!("Result: {:?}", result);
|
||||
}
|
||||
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::binary_search;
|
||||
|
||||
#[test]
|
||||
fn finds_number_near_end_of_list() {
|
||||
let num_slice = &[2, 4, 5, 12, 15, 30, 32, 33, 34, 40, 45, 51, 55, 57, 60, 66, 70, 71, 90, 99, 100];
|
||||
|
||||
assert_eq!(binary_search(num_slice, 70), Some(16));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn finds_number_near_start_of_list() {
|
||||
let num_slice = &[2, 4, 5, 12, 15, 30, 32, 33, 34, 40, 45, 51, 55, 57, 60, 66, 70, 71, 90, 99, 100];
|
||||
|
||||
assert_eq!(binary_search(num_slice, 5), Some(2));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn returns_none_for_numbers() {
|
||||
let num_slice = &[2, 4, 5, 12, 15, 30, 32, 33, 34, 40, 45, 51, 55, 57, 60, 66, 70, 71, 90, 99, 100];
|
||||
|
||||
assert_eq!(binary_search(num_slice, 1), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn finds_char() {
|
||||
let char_slice = &[
|
||||
'a',
|
||||
'b',
|
||||
'c',
|
||||
'd',
|
||||
'e',
|
||||
'f',
|
||||
'g',
|
||||
'h',
|
||||
'i',
|
||||
'j',
|
||||
'k',
|
||||
'l',
|
||||
'm',
|
||||
'n',
|
||||
'o',
|
||||
'p',
|
||||
'q',
|
||||
'r',
|
||||
's',
|
||||
't',
|
||||
'u',
|
||||
'v',
|
||||
'w',
|
||||
'x',
|
||||
'y',
|
||||
'z',
|
||||
];
|
||||
|
||||
assert_eq!(binary_search(char_slice, 'l'), Some(11));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn returns_none_for_chars() {
|
||||
let char_slice = &['a', 'b', 'c'];
|
||||
|
||||
assert_eq!(binary_search(char_slice, 'l'), None);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user