问题A:二分检索

写在前面:此篇仅用于记录个人算法学习(小新路过~)

题目描述:二分检索
算法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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值