📜  二进制搜索(不同的方法) (1)

📅  最后修改于: 2023-12-03 14:49:02.181000             🧑  作者: Mango

二进制搜索

二进制搜索,也称为二分查找,是一种高效的查找算法。它是在有序数组中查找特定元素的算法。

算法原理

在有序数组中查找某个元素时,可以从中间开始查找。如果中间的元素小于要查找的元素,则在右半部分继续查找;否则,在左半部分继续查找。这样不断缩小范围,最终找到要查找的元素,或者确定没有这个元素。

算法步骤
  1. 将数组按照从小到大的顺序排序。
  2. 设定左右两个指针,分别指向数组的起始和结束位置。
  3. 取数组的中间元素与要查找的元素进行比较。
  4. 如果中间元素等于要查找的元素,则查找成功,返回该元素的下标。
  5. 如果中间元素大于要查找的元素,则在左边的子数组中继续搜索。
  6. 如果中间元素小于要查找的元素,则在右边的子数组中继续搜索。
  7. 重复执行步骤3到6,直到找到要查找的元素或者确定没有该元素。
时间复杂度

二进制搜索算法的时间复杂度为O(log n)。

不同的实现方法
递归实现
def binary_search(arr, left, right, x):
    if right >= left:
        mid = left + (right - left) // 2

        if arr[mid] == x:
            return mid
        elif arr[mid] > x:
            return binary_search(arr, left, mid - 1, x)
        else:
            return binary_search(arr, mid + 1, right, x)

    else:
        return -1
非递归实现
def binary_search(arr, x):
    left = 0
    right = len(arr) - 1
    while left <= right:
        mid = left + (right - left) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] > x:
            right = mid - 1
        else:
            left = mid + 1

    return -1
STL中的实现

在C++ STL中,可以使用std::binary_search函数进行二进制搜索。

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    vector<int> vec { 1, 3, 5, 7, 9 };
    if (binary_search(vec.begin(), vec.end(), 5))
        cout << "Element found in vector";
    else
        cout << "Element not found in vector";

    return 0;
}
总结

二进制搜索是一种高效的查找算法,时间复杂度为O(log n)。它有多种实现方式,可以使用递归或非递归的方式实现,也可以在C++ STL中使用std::binary_search函数。