二分法,二分搜索

      二分法是一个应用很广泛的算法(好吧,刚说出这句话的时候,我查了一下资料,发现我了解的应用寥寥无几........)OK,既然不知道,那就下次补充把。咱们直接进入主题。

 

二分法(Bisection method):是一种方程式根的近似值求法

    

     算法:

        若要求已知函数f(x)=0的值则:

           1.先找出一个区间[a,b],使得f(a)与 f(b)互为异号,根据界值定理,其解一定在这个范围内。

           2.求该区间中点m=(a+b)/2,并求出f(m)的值。

           3.若f(m)y与f(a)异号,则取[a.m]为新区间,反之则取[m,b]为新区间。

           4.重复2,3的步骤,直到取到理想的近似值。

  

     以上是二分法,介绍其,是为了引出接下来要介绍的二分查找算法(我不会说是因为我没分清楚他们的区别才写的)。

     

二分搜索算法:

 

       定义:在计算机科学中,二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。其查找过程类似于上面介绍的步骤。

 

       算法:

               在一个有序数列A1,A2,A3,....... ,An中,要查找的目标值为T,查找步骤如下:

               1.令L=0,R=n-1,如果L>R,则搜素以失败告终。

               2.令m=(L+R)/2,如果A> T,则区间更新为[L,m],反之区间更新为[m,R]。

               3.不断执行步骤2,当Am=T时,传回值m。

 

        时间复杂度:O(logn),  空间复杂度:O(1)。

         

         代码:

              

#include<bits/stdc++.h>  
using namespace std;
const int maxn=200;
int num[]={12,43,5,23,12,54,32,44,1,8,9}; 
bool Binary_search(int x){
    sort(num,num+11);        //二分查找的前提,数组必须是有序数组 

    int l=0,r=10;
    while(r-l>=1){
     int mid=(l+r)/2;
     if(num[mid]==x)   return true;                
      else if(num[mid]<x) l=mid+1;
      else r=mid; 
    }
    return false;
}
int main(){
   int ab;cin>>ab;
   
     if(Binary_search(ab)) cout<<"找到了"<<ab;
     else cout<<"没有找到"<<ab;
    

    
        return 0;
} 

 

 待续.......

 

       

 

                

posted @ 2020-11-02 12:58  逊逊迅迅  阅读(239)  评论(0)    收藏  举报