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

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

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

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

算法思路

算法思路

二分查找是一种在有序数组中查找特定元素的搜索算法。该算法对数组进行比较次数的上限是 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即可。

相关文章
|
6天前
|
算法 C++
【洛谷 P1223】排队接水(贪心算法+结构体排序)
该问题要求安排$n$个人的排队顺序以最小化平均等待时间。每个人接水需时$T_i$,解决方案是让接水时间短的人优先。给定$n\leq1000$和$t_i\leq10^6$,代码示例使用C++实现,通过排序使时间从小到大排列,然后计算平均等待时间。样例输入为10个人的时间数组,输出为优化后的排队顺序及平均等待时间(291.90)。
11 0
|
5天前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
16 4
|
6天前
|
存储 算法 程序员
数据结构与算法===递归
数据结构与算法===递归
|
5天前
|
存储 算法 Java
Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。
【6月更文挑战第21天】Java查找算法概览:二分查找适用于有序数组,通过比较中间元素缩小搜索范围;哈希查找利用哈希函数快速定位,示例中使用HashMap存储键值对,支持多值关联。简单哈希表实现未涵盖冲突解决和删除操作。
13 1
|
1天前
|
存储 算法 调度
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
【数据结构与算法】详解循环队列:基于数组实现高效存储与访问
|
1天前
|
存储 算法 编译器
【数据结构与算法】使用数组实现栈:原理、步骤与应用
【数据结构与算法】使用数组实现栈:原理、步骤与应用
|
1天前
|
算法
【数据结构与算法 刷题系列】移除链表元素
【数据结构与算法 刷题系列】移除链表元素
|
2天前
|
搜索推荐 C语言
【C/排序算法】:快速排序和归并排序的非递归实现
【C/排序算法】:快速排序和归并排序的非递归实现
7 0
|
2天前
|
存储 算法 Java
Java数据结构与算法:线性数据结构之数组
Java数据结构与算法:线性数据结构之数组
|
5天前
|
人工智能 算法 搜索推荐
蓝桥杯宝藏排序题目算法(冒泡、选择、插入)
以下是内容的摘要: 本文介绍了三种排序算法:冒泡排序、选择排序和插入排序。冒泡排序通过不断交换相邻的逆序元素逐步排序,最坏情况下需要 O(n^2) 次比较。选择排序在每轮中找到剩余部分的最小元素并放到已排序序列的末尾,同样具有 O(n^2) 时间复杂度。插入排序则是将每个元素插入到已排序序列的正确位置,时间复杂度也是 O(n^2),但空间复杂度为 O(1)。