原理:
二分法搜索是一种基于分治策略的查找算法,采用了在有序列表中搜索目标值的技术。这种算法在排序的数组中进行查找,每次将查找区域减半,直到找到目标值或者确定目标值不存在。这种算法的时间复杂度为 O(log n)。
以下是一个使用C++实现二分法搜索的示例代码,其中 arr 是一个按升序排列的数组,n 表示数组的长度,key 是需要查找的值:
#include <iostream>
using namespace std;
int binarySearch(int arr[], int n, int key) {
int left = 0, right = n-1;
while (left <= right) {
int mid = left + (right - left) / 2; // 计算中间值
if (arr[mid] == key)
return mid; // 找到了目标值,返回下标
else if (arr[mid] < key)
left = mid + 1; // 目标值在右侧,更新左边界
else
right = mid - 1; // 目标值在左侧,更新右边界
}
return -1; // 没有找到目标值
}
int main() {
int arr[] = {1, 3, 5, 7, 9};
int n = sizeof(arr) / sizeof(arr[0]);
int key = 5;
int index = binarySearch(arr, n, key);
if (index != -1) {
cout << "Found at index " << index << "\n";
} else {
cout << "Not Found\n";
}
return 0;
}
在这个示例程序中,我们在 main 函数中声明了一个长度为 5 的整型数组,它包含了一些有序的整数。
我们使用 sizeof 运算符和数组元素大小来计算数组的长度,然后声明一个 key 变量,其中包含我们要在数组中查找的目标值。我们将 key 值传递给 binarySearch 函数进行查找。
如果找到该元素,则输出“Found at index”和该元素的索引,否则输出“Not Found”。返回值0表示程序正常完成。
当我们使用二分法搜索算法时,我们在一个有序(升序或者降序)的列表中进行查找。该算法的主要思想是将列表不断地分成两半,然后判断中间元素是否是我们正在查找的元素。如果是,则算法完成,返回该元素的下标。如果不是,我们将两部分列表之一丢弃,并重复这个过程,直到我们找到该目标元素或者确定该元素不存在于列表中。
以下是二分法搜索的详细步骤:
-
初始化左右指针:在开始之前,我们要求列表按升序或者降序排列,并初始化两个指针指向列表的两端。在 C++ 中,可以使用 int 型变量分别表示两端:left 和 right。
-
查找中间元素:我们需要计算出列表中间元素的位置_middle,可以通过计算 (left + right) / 2 (或left+(right-left) / 2)或使用位运算符 (left + right) >> 1 来实现。
-
比较目标元素和中间元素:如果目标元素等于中间元素,则我们可以退出程序并返回中间元素的下标。如果目标元素小于中间元素,则我们需要丢弃大于中间元素的那部分列表,并继续查找第一部分列表。如果目标元素大于中间元素,我们需要丢弃小于中间元素的那部分,并继续查找第二部分列表。
-
更新左右指针:接下来,我们需要更新左右指针。如果我们正在查找的元素在左半部分,则将 left 指针更新为 middle+1。否则,如果目标元素在右半部分,则我们将更新right指针为middle-1。
-
重复步骤2到4,直到找到目标值或者确定它不存在于列表中为止。
-
返回结果:最后,如果找到了目标值,则返回目标值在列表中的下标。否则,返回-1表明它不在列表中。
总的来说,二分法搜索算法是一种非常快速且高效的方法,用于在有序的列表中查找元素。该算法的关键在于将列表分成两半,然后丢弃我们不再查找的那部分。这就意味着,我们每次操作会将目标范围减半,因此,该算法的时间复杂度为O(log n)。