📜  binary serach (1)

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

二分查找(Binary Search)

二分查找,也称折半查找,是一种常用的查找算法。它的时间复杂度是O(log n),效率较高。对于有序的数列可以采用二分查找。二分查找的基本思想是将一组有序的数列进行分割(折半),从而缩小问题规模。由于每一次比较都使得问题规模减半,因此在最坏情况下,查找次数不会超过 log₂n 次。

算法原理
  1. 将列表按从小到大排序
  2. 确定列表的中间值mid
  3. 如果中间值等于要查找的值,返回mid
  4. 如果中间值大于要查找的值,说明要查找的值在左半部分,将mid减去1,重新计算mid
  5. 如果中间值小于要查找的值,说明要查找的值在右半部分,将mid加上1,重新计算mid
  6. 重复执行以上步骤,直到找到要查找的值或者整个列表都被查找完毕
代码实现
Python
def binary_search(arr, low, high, x):
    if high >= low:
        mid = (high + low) // 2
        if arr[mid] == x:
            return mid
        elif arr[mid] > x:
            return binary_search(arr, low, mid - 1, x)
        else:
            return binary_search(arr, mid + 1, high, x)
    else:
        return -1
Java
public static int binarySearch(int[] arr, int low, int high, int x) {
    if (high >= low) {
        int mid = low + (high - low) / 2;
        if (arr[mid] == x) {
            return mid;
        } else if (arr[mid] > x) {
            return binarySearch(arr, low, mid - 1, x);
        } else {
            return binarySearch(arr, mid + 1, high, x);
        }
    } else {
        return -1;
    }
}
示例
Python
arr = [2, 3, 4, 10, 40]
x = 10

# 函数调用
result = binary_search(arr, 0, len(arr) - 1, x)

if result != -1:
    print("元素在数组中的索引为", result)
else:
    print("数组中不存在该元素")

输出:

元素在数组中的索引为 3
Java
int arr[] = { 2, 3, 4, 10, 40 };
int x = 10;

// 函数调用
int result = binarySearch(arr, 0, arr.length - 1, x);

if (result == -1) {
    System.out.println("元素不在数组中");
} else {
    System.out.println("元素在数组中的索引为 " + result);
}

输出:

元素在数组中的索引为 3
结语

二分查找是一种高效的查找算法,但是要求数据必须是有序的,这一点需要在使用时注意。除此之外,我们还可以对二分查找进行优化,比如使用循环方式实现,或者在需要查找的数据量很小的情况下使用线性查找,避免了递归过程中的开销。