# 二分查找法

思路: 先将列表中间的元素与要查找的元素比较,如果相等直接返回,如果大了,将中间元素后面的列表元素排除,再在列表开始到列表中间元素之间进行相同操作,直到查找到匹配的元素。

时间复杂度:O (log2 n)

代码:

java:

// 方法一:递归
    public static int binarySearch(int []arr,int target,int low,int high){
        if (arr[low]==target){
            return low;
        }
        if (arr[high]==target){
            return high;
        }
        int mid = (high + low) / 2 ;
        if (arr[mid] == target){
            return mid;
        }
        if (arr[mid] > target){
            return binarySearch(arr,target,low,mid-1);
        }
        if (arr[mid] < target){
            return binarySearch(arr,target,mid + 1,high);
        }
        return -1;
    }
    // 方法二:循环
    public static int binarySearch2(int []arr,int target){
        int low = 0 ;
        int high = arr.length -1 ;
        while (low<=high){
            if (arr[low]==target){
                return low;
            }
            if (arr[high]==target){
                return high;
            }
            int mid = (high + low) / 2 ;
            if (arr[mid] == target){
                return mid;
            }
            if (arr[mid] > target){
                high = mid - 1;
            }
            if (arr[mid] < target){
                low = mid + 1;
            }
        }
        return -1;
    }

python:

# 二分查找中,数组必须是有序的
# 方法一:采用递归的方式
def binary_search(arr:list, target, start, end):
    # 如果 start 索引下的元素就是目标元素,直接返回
    if arr[start] == target:
        return start
    # 如果 end 索引下的元素就是目标元素,直接返回
    if arr[end] == target:
        return end
    # 取中间的元素 为什么是 (end + start) / 2?因为当 start>0 时,中间的索引必须是 (end - start) / 2 + start = (end + start) / 2,必须要加上 start, 否则递归会溢出,无限递归下去。
    mid = int((end + start) / 2)
    # 如果中间的元素是目标元素则直接返回
    if arr[mid] == target:
        return mid
    # 如果中间元素大于目标元素,则递归调用,将 end 设置成中间索引减 1,即 mid - 1
    if arr[mid] > target:
        return binary_search(arr, target, start, mid - 1)
    # 如果中间元素小于目标元素,则递归调用,将 start 设置成中间索引加 1,即 mid+ 1
    if arr[mid] < target:
        return binary_search(arr, target, mid + 1, end)
    return None
# 方法二:采用循环的方式
def binary_search_2(arr:list, target):
    low = 0
    high = len(arr) - 1
    while low <= high:
        if arr[low] == target:
            return low
        if arr[high] == target:
            return high
        mid = int((low + high) / 2)
        guess = arr[mid]
        if guess == target:
            return mid
        if guess > target:
            low = low + 1
        if guess < target:
            high = high + 1
    return None