二分搜索(递归)与(非递归)

本文介绍了如何使用递归和非递归方式实现二分搜索算法,并提供了样例输入和输出。在递归版本中,算法从数组中间开始查找,逐步缩小搜索范围。在非递归版本中,同样遵循这一思路。此外,还讨论了二分搜索的升级版,当元素不在数组中时,返回小于和大于该元素的最大和最小位置。
摘要由CSDN通过智能技术生成

题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。
输出
输出待查询值所在的位置,如果没有找到,则返回-1。
样例输入
3 1 2 3 2
4 0 1 3 4 2
样例输出
2
-1

思路:其实递归与非递归的思路基本一致,都是先中间再两边,找到了就返回元素下标,没找到就继续缩小区间,直到找到为止,详细思路我会注释在代码里面,如有不对,欢迎各位大佬指出。


递归代码

#include <bits/stdc++.h>
using namespace std;
int a[100000];
int digui(int k, int left, int right)
{
   
    int mid = left + ((right - left) >> 1);
    // int mid = (left + right) / 2;
    //mid=(left+right)/2  等价于 left+(right-left)/2,这样写能防止right+left溢出,写为位运算
    //mid=left+((right-left)>>1)的形式更高效,由于位运算的优先级低于逻辑运算,所以要在多项式中的位运算上加上小括号,不然程序就会错误
    //注意:left一定要写在前面,写在后面的话右移的位数就是(left+1)
    if (left <= right)
    {
                       //以下内容读者可以手动模拟一遍
        if (a[mid] == k) //如果找到了就返回数组下标对应值
            return mid;
        if (a[mid] > k) //如果所要找的k值在右边,就继续递归右边区间(区间缩小一半)
            return digui(k, left, mid 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值