二分查找(Binary Search)是一种高效的查找算法,适用于已经排序的数组或列表。以下是C++中实现二分查找的基本思路:
思路步骤:
1.定义边界: 确定搜索范围的初始边界,通常是数组或列表的起始和结束索引。
2.计算中间元素: 计算数组中间元素的索引。中间元素可以通过 (left + right) / 2 计算,其中 left 是左边界,right 是右边界。
3.比较目标值: 将目标值与中间元素进行比较。
4.如果目标值等于中间元素,则找到目标,返回中间元素的索引。
5.如果目标值小于中间元素,则目标值在数组左半部分,更新右边界为 mid - 1。
6.如果目标值大于中间元素,则目标值在数组右半部分,更新左边界为 mid + 1。
7.迭代或递归: 根据比较结果更新搜索范围,重复执行步骤2和步骤3,直到找到目标值或确定目标值不存在(即左边界大于右边界)为止。
8.返回结果: 如果找到目标值,返回其索引;否则,返回表示未找到的特定值(例如 -1)。
示例代码:
下面是一个简单的示例,实现了在有序数组 num中查找目标值 target 的二分查找算法。
#include <iostream>
#include <vector>
using namespace std;
int binarySearch(const vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid; // 找到目标值,返回索引
} else if (nums[mid] < target) {
left = mid + 1; // 更新左边界
} else {
right = mid - 1; // 更新右边界
}
}
return -1; // 未找到目标值
}
int main() {
vector<int> nums = {1, 3, 5, 7, 9, 11, 13};
int target = 7;
int index = binarySearch(nums, target);
if (index != -1) {
cout << "Target found at index: " << index << endl;
} else {
cout << "Target not found in the array." << endl;
}
return 0;
}
#include <iostream>
#include <vector>
using namespace std;
int binarySearchRecursive(const vector<int>& nums, int target, int left, int right) {
if (left > right) {
return -1; // 未找到目标值
}
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid; // 找到目标值,返回索引
} else if (nums[mid] < target) {
return binarySearchRecursive(nums, target, mid + 1, right); // 在右侧继续查找
} else {
return binarySearchRecursive(nums, target, left, mid - 1); // 在左侧继续查找
}
}
int main() {
vector<int> nums = {1, 3, 5, 7, 9, 11, 13};
int target = 7;
int index = binarySearchRecursive(nums, target, 0, nums.size() - 1);
if (index != -1) {
cout << "Target found at index: " << index << endl;
} else {
cout << "Target not found in the array." << endl;
}
return 0;
}
总结:
- 时间复杂度:二分查找的时间复杂度是 \(O(\log n)\),其中 \(n\) 是数组的长度。每次查找都会将搜索范围减半,因此效率非常高。
- 适用条件:二分查找要求数组必须是有序的。如果数组无序,需要先进行排序(例如使用快速排序或归并排序),然后再进行二分查找。
- 变种:在实际应用中,二分查找有很多变种,例如查找第一个等于目标值的位置、查找最后一个等于目标值的位置等。
掌握二分查找并能够根据不同的需求进行调整,是编程中的一项重要技能。