《2017年11月8日》【连续029天】
标题:二分查找的学习;
内容:A.观看MOOC11.2,11.3;
B.二分查找的原理与二分法相似;
(a).写一个函数BinarySeach,在包含size个元素的,从小到大排序的int数组a里查找元素p,如果找到则返回元素下标,如果找不到,则返回-1;
int BinarySearch(int a[],int size,int p)
{
int L=0; //查找区间的左端点;
int R=size-1; //查找函数的右端点;
while(L<=R){
int mid =L+(R-L)/2; //取查找区间正中元素的下标(如果区间长度为偶数,则取中间两个的前一个),之所以不用(R+L),是为了防止它超出int的范围;
if(p==a[mid])
return mid;
else if(p>a[mid])
L=mid+1;
else
R=mid-1;
}
return -1;
}
当int a[10]={1,2,23,56,57,58,59,70,71,78};

(b).写一个函数LowerBound,在包含size个元素的,从小到大排序的int数组a里查找比给定整数p小的,下标最大的元素,找到则返回其下标,找不到则返回-1;
int LowerBound(int a[],int size,int p)
{
int L=0;
int R=size-1;
int lastPos =-1; //到目前为止的最优解;
while(L<=R){
int mid=L+(R-L)/2;
if (a[mid]>p)
R=mid-1;
else{
lastPos =mid;
L = mid+1;
}
}
return lastPos;
}
数组如上:

(c).二分法求方程的根:运用零点定律和二分法;
求方程的一个根:f(x)=x^3-5x^2+10x-80=0
若根为a,则要求|f(a)|<=10^(-6)
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;
y=f(root);
while(fabs(y)>EPS){
if(y>0) x2=root;
else x1=root;
root=x1+(x2-x1)/2;
y=f(root);
}
cout<<root;
}

若将输出改为printf("%.8f",root);
则
明日计划:练习查找例题;
1823



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



