二分查找找函数
题目详情
写一个函数,在包含size个元素的,从小到大排序的int数组a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1.要求复杂度(log(N))
代码
#include<iostream>
using namespace std;
int BinarySeach(int a[1000], int size, int p)
{
int L=0;
int R=size-1;
while(L<=R)
{
int mid=L+(R-L)/2;
if(p==a[mid])
return mid;
else
if(p>a[mid])
L=mid+1;
else
R=mid-1;
}
return -1;
}
int main()
{
int c[1000];
int n,b;
cin>>n>>b;
for(int a=0;a<n;a++)
{
cin>>c[a];
}
cout<<BinarySeach(c,n,b);
}
思路
取中间值,然后和要查找的数进行对比,小了则把左边最小的范围值改为中间值加一(mid+1),大了则把右边的最大范围值改为中间值加一(mid+1),要注意 mid=L+(R-L)/2,因为mid=L+R可能超出double的最大值;
二分法求方程根
题目详情
求下面方程的一个根:f(x)=xxx-5xx+10x-80=0
若求出的根是a,则要求|f(a)|<=10^-6
思路
由于计算机精度受限,当方程值小于1e-6时,默认方程成立。这题为了减少计算时间,采用二分查找的方式。可以借鉴上面的方程。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double EPS=1e-6;
double f(double x){ return x*x*x-5*x*x+10*x-80; }
int main()
{
double root,x1=0,x2=100,y;
root=x1+(x2-x1)/2;
int triedTimes=1;//记录尝试次数
y=f(root);
while(fabs(y)>EPS)
{
if(y>0) x2=root;
else x1=root;
root=x1+(x2-x1)/2;
y=f(root);
triedTimes++;
}
printf("%.8f\n",root);
printf("%d",triedTimes);
return 0;
}
计算机201 钱yj
本文介绍了如何利用二分查找算法分别解决在一个有序数组中查找元素和在方程解的搜索中减小计算量的问题。通过实例演示了二分法的高效性和精度控制,并探讨了在信息技术中的实际应用。
1万+

被折叠的 条评论
为什么被折叠?



