二分查找(Binary Search)

来源:互联网 发布:英孚网络作业网址 编辑:程序博客网 时间:2024/03/29 02:17

· 适用:有序数组,列表

· 思想
step1: 每次从数组的中间元素开始找起
step2: 然后根据目标数字与中间元素的大小关系,锁定该中间元素的左区间或右区间
step3:重复步骤2,直至目标元素=中间元素

· 设计算法的tips
举两个例子代入你的算法,然后算法跟着你的思路走,这些函数关系与递归关系便一清二楚了!

例代码:在一个有15个元素的有序数组{2,4,…,30}中查找你的目标元素的位置

#include <iostream>#include <cmath>using namespace std;int main(){       //step 1:创建一个由小到大的15元素的有序数组(假设这个数组为2,4,6……30)    int n,a[16]; //十分注意的一点是:你要生成脚标为1-15的数组,那么这里要写a[16]    for (int i=1;i<16;i++)        a[i]=2*i;    cout<<"input a number";    cin>>n;    //step 2:核心代码    int k=8,m1=0,m2=16,lu,ld;    if(n>a[15]||n<a[1])        cout<<"not found"<<endl;    else    {        while(a[k]!=n) //二分查找的关键代码就在while循环        {            if (n>a[k])            {                           ld=k+1; //  关键点1):每次查找区间的上下限ld,lu==>然后根据上下限表示出二分中点k                lu=m2-1; //   关键点2) :这次查找区间上下限与上一次查找区间中点k的关系(我们分别用m1和m2两个中间变量架起两次查找之间的关系)                m1=k;                k=0.5*(ld+lu); // 关键点3):根据上下限表示出二分中点k            }            else            {                ld=m1+1;                lu=k-1;                m2=k;                k=0.5*(ld+lu);            }        }        cout<<k;    }    return 0;}//终极tips:举两个例子代入你的算法,然后算法跟着你的思路走,这些函数关系与递归关系便一清二楚了!

上例的改写:数组顺序为由大到小

#include <iostream>#include <cmath>using namespace std;int main(){       //step 1:创建一个由大到小的15元素的有序数组(假设这个数组为30,28,26……2)    int n,a[16]; //十分注意的一点是:你要生成脚标为1-15的数组,那么这里要写a[16]    for (int i=15;i>0;i--)        a[i]=2*(16-i);    cout<<"input a number";    cin>>n;    //step 2:核心代码    int k=8,m1=0,m2=16,lu,ld;    //先来一个判断,看target item是否超过查找区间    if(n<a[15]||n>a[1])         cout<<"not found"<<endl;    else    {        while(a[k]!=n) //二分查找的关键代码就在while循环        {            if (n<a[k])            {                           ld=k+1; //  关键点1):每次查找区间的上下限ld,lu==>然后根据上下限表示出二分中点k                lu=m2-1; //   关键点2) :这次查找区间上下限与上一次查找区间中点k的关系(我们分别用m1和m2两个中间变量架起两次查找之间的关系)                m1=k;                k=0.5*(ld+lu); // 关键点3):根据上下限表示出二分中点k            }            else            {                ld=m1+1;                lu=k-1;                m2=k;                k=0.5*(ld+lu);            }        }        cout<<k;    }    return 0;}//终极tips:举两个例子代入你的算法,然后算法跟着你的思路走,这些函数关系与递归关系便一清二楚了!
原创粉丝点击