029day(二分查找的学习)

来源:互联网 发布:阿里云国际站网址 编辑:程序博客网 时间:2024/05/29 16:32

172210704111-陈国佳总结《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);

明日计划:练习查找例题;


原创粉丝点击