题目描述
使用递归算法,实现二分搜索。
输入
多组数据输入,每组第一个数字为数组的长度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