一、二分搜索基本概念
二分搜索(Binary Search)是一種在有序數組中查找特定元素的高效算法,時間復雜度為O(log n)。
基本特點:
-
僅適用于有序數組(升序或降序)
-
每次比較將搜索范圍減半
-
比線性搜索(O(n))高效得多
二、標準二分搜索實現
1. 迭代版本(最常用)
int binarySearch(int arr[], int size, int target) {int left = 0;int right = size - 1;while (left <= right) {int mid = left + (right - left) / 2; // 防止溢出if (arr[mid] == target) {return mid; // 找到目標,返回索引} else if (arr[mid] < target) {left = mid + 1; // 目標在右半部分} else {right = mid - 1; // 目標在左半部分}}return -1; // 未找到
}
?2. 遞歸版本
int binarySearchRecursive(int arr[], int left, int right, int target) {if (left > right) {return -1;}int mid = left + (right - left) / 2;if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {return binarySearchRecursive(arr, mid + 1, right, target);} else {return binarySearchRecursive(arr, left, mid - 1, target);}
}
三、二分搜索變種
1. 查找第一個等于目標的值
int findFirst(int arr[], int size, int target) {int left = 0;int right = size - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {result = mid;right = mid - 1; // 繼續在左半部分查找} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return result;
}
2. 查找最后一個等于目標的值
int findLast(int arr[], int size, int target) {int left = 0;int right = size - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] == target) {result = mid;left = mid + 1; // 繼續在右半部分查找} else if (arr[mid] < target) {left = mid + 1;} else {right = mid - 1;}}return result;
}
3. 查找第一個大于等于目標的值
int findFirstGreaterOrEqual(int arr[], int size, int target) {int left = 0;int right = size - 1;int result = -1;while (left <= right) {int mid = left + (right - left) / 2;if (arr[mid] >= target) {result = mid;right = mid - 1;} else {left = mid + 1;}}return result;
}
四、注意
?1.常見錯誤
忘記數組必須有序
循環條件錯誤(應為left <= right
而非left < right
)
邊界更新錯誤(left = mid
而非left = mid + 1
)
整數溢出問題
2.注意事項
-
數組必須有序:二分搜索的前提條件
-
整數溢出問題:
mid = (left + right)/2
可能溢出,應使用left + (right-left)/2
-
邊界條件:正確處理left和right的更新
-
重復元素:標準實現不保證返回哪個匹配項