# Binary Search and Its Variations

Binary search is a widely used algorithm in computer science, particularly in competitive programming. It is an efficient searching algorithm that works on sorted arrays or lists. This algorithm follows a divide and conquer approach, reducing the search space by half in each step. Let's dive deeper into binary search and its variations in this article.

## Binary Search Algorithm

The binary search algorithm works by repeatedly dividing the search space in half until the desired element is found or the search space is exhausted. Here's the step-by-step process of the binary search algorithm:

1. Choose the middle element of the sorted array as the "middle" index.
2. Compare the middle element with the target element that needs to be searched.
3. If the middle element is equal to the target element, return its index, as the element has been found.
4. If the target element is less than the middle element, repeat the process on the left half of the array.
5. If the target element is greater than the middle element, repeat the process on the right half of the array.
6. Continue the process until the target element is found or the search space is exhausted.

Binary search has a time complexity of O(log n) since it eliminates half of the search space in each iteration.

The lower bound binary search variation finds the smallest element in a sorted array that is greater than or equal to the target element. It returns the index of the first occurrence of the target element or the index where it should be inserted to maintain a sorted order.

The implementation of the lower bound binary search is similar to the binary search algorithm, except for one key difference. When the middle element is less than the target element, the search space is shifted to the right half, including the middle element. This ensures that the leftmost occurrence of the target element is found.

The upper bound binary search variation finds the smallest element in a sorted array that is greater than the target element. It returns the index where the target element should be inserted to maintain a sorted order.

Similar to the lower bound binary search, the upper bound binary search shifts the search space to the right half when the middle element is less than or equal to the target element. This ensures that the rightmost occurrence of the target element is found.

The binary search algorithm can also be implemented recursively. In this variation, the search space is divided into two halves at each step. The recursive binary search starts with the entire array as the search space. The base case returns if the search space is empty or if the target element has been found. Otherwise, the search is performed on either the left or right half based on the comparison with the middle element.

The recursive binary search offers a concise and elegant implementation, though it may consume more space due to the recursive function calls.

## Conclusion

Binary search is a powerful algorithm for efficient searching in sorted arrays. Its variations, including the lower bound binary search, upper bound binary search, and recursive binary search, provide flexibility and additional functionalities. Understanding these variations and their implementations can greatly enhance your problem-solving skills in competitive programming using C++.