Binary Search in Array using Iteration
Problem and examples
You are given a sorted array of integers and a target number. Your task is to find the index of the target number using the binary search algorithm, implemented in an iterative way (using loops instead of recursion).
Binary search works only when the array is sorted in ascending order. If the target exists in the array, return its index. Otherwise, return -1.
| Input Array | Target | Output | Description |
|---|---|---|---|
| [10, 20, 30, 40, 50] | 30 | 2 | Target 30 is at index 2 |
| [5, 10, 15, 20, 25] | 5 | 0 | First element match |
| [5, 10, 15, 20, 25] | 25 | 4 | Last element match |
| [1, 3, 5, 7, 9] | 6 | -1 | 6 does not exist in the array |
| [2, 4, 6, 8, 10] | 11 | -1 | Target is greater than all elements |
| [2, 4, 6, 8, 10] | 1 | -1 | Target is smaller than all elements |
| [] | 10 | -1 | Empty array, nothing to search |
| [100] | 100 | 0 | Single element match |
| [100] | 200 | -1 | Single element does not match |
Explore Binary Search in Array - Iteration
Load an example or enter your own input. Use the player controls to follow each change.
Step-by-Step Understanding of Binary Search
Before diving into code, let’s first understand what binary search is trying to solve.
Imagine you have a sorted array of numbers, and you're trying to find the index of a particular number (called the target). Instead of checking each number one by one, which can be slow, binary search helps you find the number much faster—by always checking the middle of the current search range and cutting the problem in half at each step.
This method is extremely efficient, with a time complexity of O(log n), making it ideal for searching in large sorted arrays.
Example Problem
Let’s say we are given the sorted array: [2, 4, 6, 8, 10, 12, 14] and we are asked to find the index of the number 10.
Step-by-Step Execution
- We start with two pointers:
low = 0(start of the array)high = 6(end of the array)
- Calculate mid index:
mid = Math.floor((0 + 6) / 2) = 3 - Check the middle element:
arr[3] = 8 - Since
8 < 10, the target must be in the right half, so we setlow = mid + 1 = 4 - Now,
low = 4,high = 6. Calculate new mid:mid = Math.floor((4 + 6) / 2) = 5 - Check
arr[5] = 12. Since12 > 10, we now look in the left half:high = mid - 1 = 4 - Now,
low = 4andhigh = 4. So,mid = 4 arr[4] = 10which is the target! Return index4
How the Algorithm Works
- Keep narrowing the range between
lowandhigh - Each time, compare the middle element to the target
- If it's a match, return the index
- If the target is smaller, search in the left half
- If the target is larger, search in the right half
- Repeat until
lowexceedshigh
Handling Edge Cases
- Target not in the array: Eventually,
low > high, and we return-1 - Target smaller than all elements: First mid will already be greater, and we keep moving left until no elements are left
- Target greater than all elements: Mid will always be smaller, we keep moving right until no elements are left
- Empty array: Since
low = 0andhigh = -1initially, the loop doesn't run and we return-1 - Single element array:
- If it matches the target → return index 0
- If not → return -1
Finally
Binary search is one of the most efficient algorithms for searching in sorted arrays. It’s important to carefully manage the low and high pointers and always check for edge cases like empty arrays or off-bound conditions. Once mastered, binary search becomes a powerful tool in your problem-solving toolkit.
- Given a sorted array
arrand atargetvalue. - Initialize two pointers:
low = 0andhigh = arr.length - 1. - Repeat while
low ≤ high: - → Calculate
mid = Math.floor((low + high) / 2). - → If
arr[mid] == target, returnmid(target found). - → If
arr[mid] < target, setlow = mid + 1. - → Else, set
high = mid - 1. - If the loop ends without finding the target, return
-1(not found).
Implementation and efficiency
C implementation
#include <stdio.h>
int binarySearch(int arr[], int size, int target) {
int low = 0, high = size - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11};
int size = sizeof(arr) / sizeof(arr[0]);
int target = 7;
printf("Index: %d\n", binarySearch(arr, size, target));
return 0;
}C++ implementation
#include <iostream>
#include <vector>
using namespace std;
int binarySearch(vector<int>& arr, int target) {
int low = 0, high = arr.size() - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}
int main() {
vector<int> arr = {1, 3, 5, 7, 9, 11};
int target = 7;
cout << "Index: " << binarySearch(arr, target) << endl;
return 0;
}Python implementation
def binary_search(arr, target):
low, high = 0, len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1
# Sample Input
arr = [1, 3, 5, 7, 9, 11]
target = 7
print("Index:", binary_search(arr, target))Java implementation
public class BinarySearch {
public static int binarySearch(int[] arr, int target) {
int low = 0, high = arr.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (arr[mid] == target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11};
int target = 7;
System.out.println("Index: " + binarySearch(arr, target));
}
}JavaScript implementation
function binarySearch(arr, target) {
let low = 0, high = arr.length - 1;
while (low <= high) {
let mid = Math.floor((low + high) / 2);
if (arr[mid] === target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}
// Sample Input
const arr = [1, 3, 5, 7, 9, 11];
const target = 7;
console.log("Index:", binarySearch(arr, target));Go implementation
package main
import (
"fmt"
)
func binarySearch(arr []int, target int) int {
low, high := 0, len(arr)-1
for low <= high {
mid := (low + high) / 2
if arr[mid] == target {
return mid
} else if arr[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return -1
}
func main() {
arr := []int{1, 3, 5, 7, 9, 11}
target := 7
fmt.Println("Index:", binarySearch(arr, target))
}Rust implementation
fn binary_search(arr: &[i32], target: i32) -> i32 {
let mut low = 0;
let mut high = arr.len() as i32 - 1;
while low <= high {
let mid = (low + high) / 2;
if arr[mid as usize] == target {
return mid;
} else if arr[mid as usize] < target {
low = mid + 1;
} else {
high = mid - 1;
}
}
-1
}
fn main() {
let arr = [1, 3, 5, 7, 9, 11];
let target = 7;
println!("Index: {}", binary_search(&arr, target));
}Kotlin implementation
fun binarySearch(arr: IntArray, target: Int): Int {
var low = 0
var high = arr.size - 1
while (low <= high) {
val mid = (low + high) / 2
when {
arr[mid] == target -> return mid
arr[mid] < target -> low = mid + 1
else -> high = mid - 1
}
}
return -1
}
fun main() {
val arr = intArrayOf(1, 3, 5, 7, 9, 11)
val target = 7
println("Index: ${binarySearch(arr, target)}")
}Swift implementation
func binarySearch(_ arr: [Int], _ target: Int) -> Int {
var low = 0, high = arr.count - 1
while low <= high {
let mid = (low + high) / 2
if arr[mid] == target {
return mid
} else if arr[mid] < target {
low = mid + 1
} else {
high = mid - 1
}
}
return -1
}
let arr = [1, 3, 5, 7, 9, 11]
let target = 7
print("Index: \(binarySearch(arr, target))")TypeScript implementation
function binarySearch(arr: number[], target: number): number {
let low = 0, high = arr.length - 1;
while (low <= high) {
const mid = Math.floor((low + high) / 2);
if (arr[mid] === target) return mid;
else if (arr[mid] < target) low = mid + 1;
else high = mid - 1;
}
return -1;
}
// Sample Input
const arr: number[] = [1, 3, 5, 7, 9, 11];
const target: number = 7;
console.log("Index:", binarySearch(arr, target));Time complexity
| Case | Time | Explanation |
|---|---|---|
| best case | O(1) | The target element is found at the middle index on the first comparison. |
| average case | O(log n) | The search space is divided in half during each iteration until the target is found or determined to be absent. |
| worst case | O(log n) | The target is located at the very beginning or end, or is not in the array, requiring the full depth of the binary search process. |
Space complexity
O(1)
The algorithm uses constant space. It only maintains a few variables (like low, high, and mid) and does not allocate extra space based on input size.