二分查找 ← vector实现

【算法分析】
● 折半查找(Binary Search)也称
二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

● 折半查找每一次查找都使查找范围缩小一半,与顺序查找相比,很显然会提高查找效率。为了标记查找过程中每一次的查找区间,分别用low和high来表示当前查找区间的下界和上界,mid=(low+high)/2为区间的中间位置。

● 折半查找的查找过程为:
(1)从表的中间记录开始,如果待查值和中间记录的关键字相等,则查找成功;
(2)如果待查值大于中间记录的关键字,则新的查找区间是
[mid+1..high]
(3)如果待查值小于中间记录的关键字,则新的查找区间是
[low..mid-1]
重复上述操作,直到查找成功,或者在某步时查找区间为空,则代表查找失败。


【算法代码】

#include<bits/stdc++.h>
using namespace std;

int binSearch(vector<int> &a, int key) {
	int low=0;
	int high=a.size()-1;
	while(low<=high) {
		int mid=(low+high)/2;
		if(a[mid]>key) high=mid-1;
		else if(a[mid]<key) low=mid+1;
		else return mid;
	}
	return -1;
}

int main() {
	vector<int> v;
	int n;
	cin>>n;
	for(int i=0; i<n; i++) {
		int x;
		cin>>x;
		v.push_back(x);
	}
	
	int key;
	cin>>key;
	int t=binSearch(v,key);
	if(t==-1) cout<<"No found"<<endl;
	else cout<<"Index is "<<t<<endl;

	return 0;
}


/*
in:
11
5 16 20 27 30 36 44 55 60 67 71
36

out:
Index is 5
---------
in:
11
5 16 20 27 30 36 44 55 60 67 71
65

out:
No found
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值