二分查找入门教学(动态讲解图、模拟示例、二分查找代码讲解)

博客昵称:吴NDIR
个人座右铭:得之淡然,失之坦然
作者简介:喜欢轻音乐、象棋,爱好算法、刷题
其他推荐内容:计算机导论速记思维导图
其他内容推荐:五种排序算法


在这个愉快的周末让我们聊一下二分查找吧!二分查找是一种很常用的算法,可帮助我们在有序数组中快速查找元素。

二分查找

概念

  1. 问题:想象一下,你有一堆按升序排列的数字,并且你需要在其中查找一个对应的数字。
  • 如果你采用线性查找方式,即从数组的首个元素开始遍历,一直到找到对应数字为止。

在这里插入图片描述

  • 显然,采用这种方法你可能需要遍历整个数组。如果数组很大,则这种线性查找方式会变得很慢。让我们看看二分查找吧!
  • 当我们需要在一个有序数组中查找某个值的位置时,二分查找是一个高效的算法。这个算法的核心思想是将数组一分为二,然后判断目标值可能存在于数组的哪一个半边,不断缩小范围,最终找到目标位置或者确定目标值不存在于数组中。

在这里插入图片描述下面是二分查找的一般步骤:

  1. 首先确定目标值在数组的哪个区间内。将目标值和数组的中间值进行比较,如果目标值等于中间值,那么我们已经找到了目标,在中间值的位置返回。如果目标值小于中间值,那么我们将在左半边查找目标,否则我们将在右半边查找目标。

  2. 分别使用上一步中的方式在左半边或右半边递归查找,直到找到目标或者确定目标不存在于数组中。

  3. 如果我们发现要查找的目标值不在数组中,那么我们可以返回 -1 表示未找到目标。

二分查找的时间复杂度为 O(log n),其中 n 表示数组长度。这是因为每次比较可以将查找范围减半,而在最坏情况下需要进行的比较次数是 log n。在使用二分查找时,需要注意一些细节,首先数组必须是已经排序好的,查找范围的左右边界需要正确设置,一些边界条件需要特殊处理等。同时,二分查找并不适用于所有场景,例如数据量很小时使用暴力搜索会更加有效。

引例

现在让我们看看一道有关二分查找的题目吧!

题目描述:

  • 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

  • 思路步骤
    在这里插入图片描述

1.首先将数组分为左右两个区间
2.将中间数与待查找目标比较

  • 在查找范围区间[left, right]中取中点 mid,比较 nums[mid] 和 target 的大小。
    如果 nums[mid] = target,则mid即为要寻找的下标,返回 mid。
    如果 nums[mid] < target,则target只可能在mid的右侧,更新区间[mid+1,right]。
    如果 nums[mid] > target,则target只可能在mid的左侧,更新区间[left,mid-1]。

3.重复步骤1和2,直到找到目标target或者未找到目标但left=right
4.最终返回下标,或返回-1表示 target 不存在于 nums 数组中。
在这里插入图片描述

  • 示例代码
int search(int nums[], int numsSize, int target){
    
    
    int left=0,right=numsSize-1,mid;
    while(left<=right){
    
    
   		mid=left+(right-left)/2;//根据新区间定义中间数下标
   		//比较判断
        if(nums[mid]<target){
    
    
            left=mid+1;//定义区间[mid+1,right]
        }
        else if(nums[mid]>target){
    
    
            right=mid-1;//定义区间[left,mid-1]
        }
        else{
    
    
            return mid;//找到target并返回下标
        }
    }
    return -1;//未找到返回-1
}

讲解

  • 在上述代码中,我们首先初始化左右两个指针。**left 和 right 分别指向数组的第一位和最后一位。**然后,我们在循环中计算中间指针 mid 的位置,再将中间指针的值与要查找的值进行比较,以确定在哪一侧继续搜索。如果找到匹配值,则返回其下标;否则,如果整个数组都已搜索完毕,则返回 -1。
  • 那么,我们要如何保证它的正确性和性能呢?
  1. 首先,我们需要确保我们的算法是正确的。在二分查找中,正确性在于确定中间元素是否是我们正在寻找的值,而不是中间位置是否已经被检查过。因此,我们可以通过在每个循环中将查找范围的一半排除来保证其正确性。
  • 其次,我们需要考虑性能问题。在最坏情况下,遍历整个数组的时间复杂度为 O ( l o g n ) O(log n) O(logn)。但是,由于此算法可以轻松地丢弃一半的数据,因此在一些特殊情况下,我们可以获得更快的执行速度。

总而言之,二分查找是一种非常有效的算法,特别是在大型数据集上查找单个值时。通过理解二分查找算法的工作原理,我们可以更好地掌握它并将其用于实际开发中。

猜你喜欢

转载自blog.csdn.net/m0_73589720/article/details/129652917
今日推荐