# Searching in a vector

and program for linear and binary search in a vector Rust

## Introduction

Searching is finding the index of an element in a collection of elements. Here, in this article, we will discuss how to search for a given element in a vector.

We can search for an element in a vector ar an array in 2 possible ways

**Linear Search :**In this, we traverse through whole vector till the element is found. Hence, it takes**O( n )**time complexity.**Binary Search :**In this, we only check mid-points instead of checking the whole vector. Hence, it takes only**O( log(n) )**time complexity. Vector must be sorted for Binary Search.

## Linear Search

In the Linear Search, we traverse the whole vector, and check if the given element is equal to key. If the element is found, its index is returned.

As it traverses the whole array, it takes **O( n )** time complexity.

Also, **order of array does not matter** for linear search. It is very simple to implement. Here is a simple function demonstrating Linear Search

fn search(vecky:&Vec<usize>, key:usize) -> usize{for i in 0..vecky.len() {if vecky[i] == key {return i;}}// If element is not foundreturn vecky.len();}

Program With driver code

fn search(vecky:&Vec<usize>, key:usize) -> usize{for i in 0..vecky.len() {if vecky[i] == key {return i;}}// If element is not foundreturn vecky.len();}// Driver codefn main() {let vecky = vec![0, 1, 2, 3, 4, 5];println!("{}", search(&vecky, 4) );println!("{}", search(&vecky, 100) );}

**Output**

4

6

**Time Complexity : O( n )**

**Space Complexity : O( 1 )**

The standard crate in Rust only has `binary_search()`

and `contains()`

function. So, you will have to make your own search function for Linear Search, as above

## Binary Search

In the Binary Search, we only check the midpoints of a **sorted list**. Each time, we have to search only in half of the list. Hence, its complexity is **O( log(n) )**.

Also, the vector **must be sorted** for Binary search.

Here is the Algorithm

- Calculate the mid-point of the
**sorted**vector. - If the element is equal to the mid-point, return the index of the mid-point.
- If the Element is greater than the mid-point, search for the element in the slice containing the larger values.
- If the element is less than the mid-point, search the elements in slice containing smaller values than the mid-point.
- Go back to step 2, till we have no elements left in the slice.

**Note :** If we observe carefully, each time if the element is not found, we have to find for the element in only the half of the vector. So, it takes only **O ( log(n) )** for finding any element.

Here is the function for Binary Search in Rust

fn binary_search(vecky:&Vec<usize>, key:usize) -> usize{let mut low = 0;let mut high = vecky.len()-1;while low <= high {let mid = low + (high - low) / 2;// If key is middle element, return itif vecky[mid] == key {return mid;}// If key is greater than middle element, we ignore left halfif vecky[mid] < key {low = mid + 1;}// If key is less than middle element, we ignore right halfelse{high = mid - 1;}}// If the element is not foundreturn vecky.len();}

Use the same driver code.

**Output**

4

6

**Time Complexity : O( log(n) )**

**Space Complexity : O( 1 )**

## binary_search() function

Rust already has ** binary_search()** function built into it. It is already there in

`std::vec::Vec`

and hence, included in prelude. So, you don't even have to import it explicitly.For example,

fn main() {let vecky = vec![0, 1, 2, 3, 4, 5];println!("{}", vecky.binary_search(&4).expect("Not found") );println!("{}", vecky.binary_search( &100).expect("Not Found") );}

**Output**

4

thread 'main' panicked at 'Not Found: 6'

Hence, you can easily use `binary_search()`

function on any vector or a slice of vector in Rust.

## Conclusion

Searching is an important operation in a Vector. In this article, we discussed Linear Search as well as Binary Search and saw their programs and also how to use built-in function to perform Search in Rust.

**Thank You**