二分查找(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:举两个例子代入你的算法,然后算法跟着你的思路走,这些函数关系与递归关系便一清二楚了!
阅读全文
0 0
- 二分查找(Binary Search)
- 二分查找(Binary Search)
- 二分查找(Binary Search)
- 二分查找(binary search)
- 二分查找(Binary Search)
- 二分查找(binary search)
- 二分查找(Binary Search)
- 二分查找(Binary Search)
- 二分查找(binary search)
- 二分查找(Binary Search)
- binary-search( 二分查找 )
- 二分查找Binary Search
- Binary Search二分查找
- 二分查找 Binary Search
- 二分查找(Binary Search)
- 二分查找 Binary Search
- Binary Search 二分查找
- Binary Search 二分查找
- Linux基础学习笔记之切换终端的方法
- eclipse修改maven web项目的访问根目录
- 数字电子钟 1Hz 秒脉冲信号的设计
- html+css任务笔记
- flyweight——享元模式
- 二分查找(Binary Search)
- 进程-进程标识符
- Costume Party POJ
- (一)OpenCV学习笔记——Linux下编译运行opencv程序
- Androidstudio启动模拟器失败Intel HAXM is required to run this AVD,VT-x is disabled in BIOS;
- 非常好的raft协议教程
- 块级元素与行内元素
- uC/OS-III任务创建函数OSTaskCreate()
- 有计划的工作,有情调的生活