package com.thealgorithms.searches; import com.thealgorithms.devutils.searches.SearchAlgorithm; /** * Binary Search Algorithm Implementation * *
Binary search is one of the most efficient searching algorithms for finding a target element * in a SORTED array. It works by repeatedly dividing the search space in half, eliminating half of * the remaining elements in each step. * *
IMPORTANT: This algorithm ONLY works correctly if the input array is sorted in ascending * order. * *
Algorithm Overview: 1. Start with the entire array (left = 0, right = array.length - 1) 2. * Calculate the middle index 3. Compare the middle element with the target: - If middle element * equals target: Found! Return the index - If middle element is less than target: Search the right * half - If middle element is greater than target: Search the left half 4. Repeat until element is * found or search space is exhausted * *
Performance Analysis: - Best-case time complexity: O(1) - Element found at middle on first * try - Average-case time complexity: O(log n) - Most common scenario - Worst-case time * complexity: O(log n) - Element not found or at extreme end - Space complexity: O(1) - Only uses * a constant amount of extra space * *
Example Walkthrough: Array: [1, 3, 5, 7, 9, 11, 13, 15, 17, 19] Target: 7 * *
Step 1: left=0, right=9, mid=4, array[4]=9 (9 > 7, search left half) Step 2: left=0, * right=3, mid=1, array[1]=3 (3 < 7, search right half) Step 3: left=2, right=3, mid=2, * array[2]=5 (5 < 7, search right half) Step 4: left=3, right=3, mid=3, array[3]=7 (Found! * Return index 3) * * @author Varun Upadhyay (https://github.com/varunu28) * @author Podshivalov Nikita (https://github.com/nikitap492) * @see SearchAlgorithm * @see IterativeBinarySearch */ class BinarySearch implements SearchAlgorithm { /** * Generic method to perform binary search on any comparable type. This is the main entry point * for binary search operations. * *
Example Usage: *
* Integer[] numbers = {1, 3, 5, 7, 9, 11};
* int result = new BinarySearch().find(numbers, 7);
* // result will be 3 (index of element 7)
*
* int notFound = new BinarySearch().find(numbers, 4);
* // notFound will be -1 (element 4 does not exist)
*
*
* @param How it works: *
Time Complexity: O(log n) because we halve the search space each time.
* Space Complexity: O(log n) due to recursive call stack.
*
* @param