本文正在参与掘金团队号上线活动,点击查看大厂春招职位
一、题目描述
问题描述
用递归函数实现二分法查找数组元素。
补充:要求给定数组采用如下代码定义
int data[200];
for (i=0; i<200; i++)
data[i]=4*i+6;
输入格式
输入一个待查找的整数(该整数一定在数组data中)。
输出格式
该整数在数组中的指标。
样例输入
一个满足题目要求的输入范例。
例1: 262
例2: 438
例3: 774
样例输出
与上面的样例输入对应的输出。
例1:64
例2:
108
例3:
192
数据规模和约定
输入数据中每一个数的范围。 输入数据必须满足4*i+6,i=0,1,2,3,...,198,199。
资源限制
时间限制:1.0s 内存限制:256.0MB
二、思路分析
本来我不会二分查找,于是就直接根据数据特征输入输出了,如法一
后来花了半小时学了下二分查找,用二分法写了后面两个代码,第一次在程序中实现二分查找,牛刀小试😁
二分查找思想需要在有序数列里实现,首先拿一个元素和数列中间元素比较,如果比中间大,则再与后半部分中间的数比较,反之则与前半部分中间的数比较,总之就是不断和中间数据比较,直到相等为止
三、AC代码
法一:直接解法
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
cout<<(n-6)/4;
return 0;
}
法二: 二分查找
#include<bits/stdc++.h>
using namespace std;
int Binsearch(int data[],int low,int high,int key)
{
while(low<=high)
{
int mid=(low+high)/2;
if(data[mid]==key) return mid;
else if(data[mid]>key)
high=mid-1;
else low=mid+1;
}
}
int main()
{
int data[200],n;
for(int i=0;i<200;i++)
data[i]=4*i+6;
cin>>n;
cout<<Binsearch(data,0,199,n);
return 0;
}
法三: 二分查找递归版
#include<bits/stdc++.h>
using namespace std;
int Binsearch(int *data,int low,int high,int key)
{
if(low<=high)
{
int mid=(low+high)/2;
if(data[mid]==key) return mid;
else if(data[mid]>key)
return Binsearch(data,low,mid-1,key);
else return Binsearch(data,mid+1,high,key);
}
}
int main()
{
int data[200],n;
for(int i=0;i<200;i++)
data[i]=4*i+6;
cin>>n;
cout<<Binsearch(data,0,199,n);
return 0;
}
四、总结
二分查找是种简单的算法,但是想要完全精通二分查找还是不简单的
坚持学习,每天离算法大神近一点😃