「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」。
江南小村,已是深夜,零星灯火之中。
一间平房,灯亮着,一对青年男女
“老谢,我手里现在有一个数组,怎么找一个元素好?”
“什么样的数组”
“有序的,6、10、14...到802,”
“emmm.有序的...小郭,我有一个idea,二分查找!”
小郭:二分查找是个啥?
谢二:二分查找是一种查找算法,时间复杂度为 O(log2n),用来在有序数列中查找元素,首先把要找的元素和数列中间元素比较大小,如果比中间大,就再和数列后半部分的中间元素比较,如果相等,就就找到了,没找到就不断的和中间元素比较,直到找到为止
小郭:我还是不太明白诶...
谢二:举个栗子
1 2 3 4 5 6 7
要查找的元素为2
首先和中间元素4比较,比2大,则接着用4之前的元素段,1 2 3三个元素中中间元素2比较,刚好相等,Bingo!
小郭:我好像有点懂了。
谢二:我再给你讲个故事吧。
有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再把这堆书分成两堆…… 最终,检测了 logN 次之后,保安成功的找到了那本引起警报的书,露出了得意和嘲讽的笑容。于是小明背着剩下的书走了。 从此,图书馆丢了 N - 1 本书。
小郭:奥奥,我明白了,除了需要有序,二分查找还只能查找一个元素
谢二:Good!
那我再给你布置个题目
二分法查找数组元素。
输入一个待查找的整数(该整数一定在数组data中)。
Data必须满足4*i+6,i=0,1,2,3,...,198,199。
输出该整数在数组中的指标。\
#include<bits/stdc++.h>
using namespace std;
int Binsearch(int *data,int low,int high,int key)
{
if(low<=high)
{
int mid=(low+high)/2;
if(data[mid]==key) return mid;
else if(data[mid]>key)
return Binsearch(data,low,mid-1,key);
else return Binsearch(data,mid+1,high,key);
}
}
int main()
{
int data[200],n;
for(int i=0;i<200;i++)
data[i]=4*i+6;
cin>>n;
cout<<Binsearch(data,0,199,n);
return 0;
}
结语
小郭...她现在要睡觉了,所以二分查找告一段落了