写在前面:此篇仅用于记录个人算法学习(小新路过~)
题目描述:二分检索
算法2.1 BinarySearch(T, x)
输入:排好序数组T,数 x
输出:j //如果 x 在 T 中,j为下标;否则为0
1. l←1; r←n
2. while l≤r do
3. m←⌊(l+r)/2⌋
4. if T[m]=x then return m //x恰好等于中位元素
5. else if T[m]>x then r←m-1
6. else l←m+1
return 0
要求:保持算法的结构不变!
输入:n
排好序数组T
数 x
输出:j //如果 x 在 T 中,j为下标;否则为0
元素比较次数
样例输入:
13 0 7 8 10 13 16 25 27 64 86 88 90 99 16
样例输出:
6 7
#include<iostream>
using namespace std;
const int N = 1e5 + 7; //定义足够大的数组空间
int n,x;
int T[N];
int main(){
//获取输入数据
cin >> n;
for (int i = 1; i <= n; i ++){
cin >> T[i];
}
cin >> x;
//进入检索步骤
int l=1,r=n;
int sum=0,j=0; //sum记录检索次数
while(l<=r){
int m=(l+r)/2; //m为二分检索的中间值
sum++;
if(T[m]==x){
j=m;
break;
}
else if(T[m]>x){
//如果检索的数值小于中间值T[m],则在中间值的左半部分继续进行下一次的检索,else为另种大于的情况
r=m-1;
}else l=m+1;
sum=sum+1;
}
//结果输出
cout<<j<<endl;
cout<<sum<<endl;
return 0;
}