二分查找
Posted qf-breeze
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找相关的知识,希望对你有一定的参考价值。
分治最重要的思想不还是二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
--from 百度百科
Code
#include <iostream> #include <algorithm> using namespace std; typedef long long ll; inline ll read(){ ll x=0,f=1; char ch=getchar(); while(!isdigit(ch)) (ch==‘-‘)&(f=-1),ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); return x*f; } int n; const int N=1<<20; int a[N]; signed main(){ n=read(); for(register int i=1;i<=n;i++) a[i]=read(); int find=read();//需要查找的数字 或是比它大的最小数字 sort(a+1,a+n+1);//必须是有序列 所以需要sort一遍来查找 int l=0,r=n; while(l<=r){ int mid=l+r>>1; if(a[mid]<find) l=mid+1;//把条件改下就变成比它小的最大数字。。(你懂的) else r=mid-1; } if(l>n) puts("No find");//如果l>n就说明数列中没有这个数字 else cout<<l<<endl; return 0; }
以上是关于二分查找的主要内容,如果未能解决你的问题,请参考以下文章