Continuing the Algorithm in a Nutshell series, here is the code:
trait MaxElem<T> {
fn max_elem<'a>(&'a self) -> &'a T;
}
impl<T> MaxElem<T> for Vec<T> where T: PartialOrd {
fn max_elem<'a>(&'a self) -> &'a T {
max_elem_helper(self, 0, self.len())
}
}
fn max_elem_helper<'a, T>(vec: &'a Vec<T>, left: usize, right: usize) -> &'a T
where T: PartialOrd
{
if right - left == 1 {
return &vec[left];
}
let mid = (left + right) / 2;
let max1 = max_elem_helper(vec, left, mid);
let max2 = max_elem_helper(vec, mid, right);
if max1 > max2 {
max1
} else {
max2
}
}
#[cfg(test)]
mod test {
use max_elem::MaxElem;
#[test]
fn test_max_elem() {
let vec = vec![11, 2, 9, 1, 3, 88];
let m = *vec.max_elem();
assert_eq!(m, 88);
}
}
It's a simple algorithm that divide a vector into two parts and recursively search for the maximum.
All suggestions are welcome.