实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)

简介: 实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)

实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)

简介:实现一个二分搜索算法,搜索指定元素在已排序数组中的位置。(递归或者非递归实现)

算法思路

算法思路

二分查找是一种在有序数组中查找特定元素的搜索算法。该算法对数组进行比较次数的上限是 O(log n)。核心思想是通过每次将查找区间缩小一半来逐步接近查找目标。因为每次查找后查找区间都缩小了一半,所以时间复杂度是对数级别。

具体实现如下:

  1. 选择左右两端点取中间值,然后与目标值相比较
  2. 如果当前中间值大于目标值,则说明目标值只可能在mid左侧,所以再次在[l, mid-1]区间进行查找
  3. 如果当前中间值小于目标值,则说明目标值只可能在mid右侧,所以再次在[mid+1, r]区间进行查找
  4. 重复执行步骤1~3,直到找到目标值或确定不存在目标值

下面是C++代码实现,每行注释详细解释其作用:

#include <iostream>
using namespace std;
int binarySearch(int arr[], int l, int r, int x) { // 当前查找区间为 [left, right]
    if (r >= l) { // 当还有剩余未查找的元素时循环
        int mid = l + (r - l) / 2; // 取中间值
        if (arr[mid] == x) return mid; // 如果中间值等于目标值,则直接返回
        if (arr[mid] > x) return binarySearch(arr, l, mid - 1, x); // 如果中间值大于目标值,则在左边的区间中查找
        return binarySearch(arr, mid + 1, r, x); // 否则在右边的区间中查找
    }
    return -1; // 如果数组中不存在目标元素,则返回-1
}
int main() {
    int arr[] = {1, 3, 5, 7, 9}; // 已排序数组a
    int n = sizeof(arr) / sizeof(arr[0]); // 数组长度为n
    int x = 5; // 要查找的元素x
    int result = binarySearch(arr, 0, n - 1, x); // 调用二分搜索函数
    cout << "The index of " << x << " in array is: " << result << endl; // 输出结果
    return 0;
}

需要注意的是,在实现中我们使用递归方式进行查找。每次将当前查找区间中点与目标值进行比较,如果相等,则表示已经找到目标元素;如果中间值大于目标元素,则说明目标元素只可能在mid左侧,所以再次在[l, mid-1]区间进行查找;否则说明目标元素只可能在mid右侧,所以再次在[mid+1, r]区间进行查找。重复执行这个过程,直到找到或确定不存在目标元素。

同时,递归方式的实现还需要注意满足递归退出条件。当当前查找区间[l, r]变成[low, high]时,如果high < low,则说明不存在目标元素,返回-1即可。

  • Java版本
class Solution {
    public int binarySearch(int[] arr, int l, int r, int x) {
        if (r >= l) { // 当还有剩余未查找的元素时循环
            int mid = l + (r - l) / 2; // 取中间值
            if (arr[mid] == x) return mid; // 如果中间值等于目标值,则直接返回
            if (arr[mid] > x) return binarySearch(arr, l, mid - 1, x); // 如果中间值大于目标值,则在左边的区间中查找
            return binarySearch(arr, mid + 1, r, x); // 否则在右边的区间中查找
        }
        return -1; // 如果数组中不存在目标元素,则返回-1
    }
    public static void main(String[] args) {
        Solution sol = new Solution();
        int[] arr = {1, 3, 5, 7, 9}; // 已排序数组a
        int n = arr.length; // 数组长度为n
        int x = 5; // 需要查找的目标值
        int result = sol.binarySearch(arr, 0, n - 1, x); // 调用二分搜索函数
        System.out.println("The index of " + x + " in array is: " + result); // 输出结果
    }
}

同样地,在Java中我们也使用递归方式进行查找。每次将当前查找区间中点与目标值进行比较,如果相等,则表示已经找到目标元素;如果中间值大于目标元素,则说明目标元素只可能在mid左侧,所以再次在[l, mid-1]区间进行查找;否则说明目标元素只可能在mid右侧,所以再次在[mid+1, r]区间进行查找。重复执行这个过程,直到找到或确定不存在目标元素。

同时,递归方式的实现还需要注意满足递归退出条件。当当前查找区间[l, r]变成[low, high]时,如果high < low,则说明不存在目标元素,返回-1即可。

相关文章
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
487 5
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
591 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
434 0
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
1041 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
631 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
531 1
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
282 0
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
1046 0
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
618 2
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
541 3

热门文章

最新文章