二分查找

一、自己实现的

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

int arr[100];

//二分查找 
bool BinarySearch(int n, int target){
	int left = 0;
	int right = n-1;
	while(left <= right){
		int middle = left + (right - left) / 2;
		if(arr[middle] < target){
			left = middle+1;
		}else if(arr[middle] > target){
			right = middle - 1;
		}else{
			return true;
		}
	}
	return false;
}

int main(){
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; ++i){
		scanf("%d",&arr[i]);
	}
	//二分查找必须是有序序列,所以在查找之前要排序 
	sort(arr,arr+n);
	int m;
	scanf("%d",&m);
	for(int i = 0;i < m; ++i){
		int target;
		scanf("%d",&target);
		if(BinarySearch(n,target)){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
} 

二、系统自带的

c++内置二分查找

#include < algorithm >

一、binary_search:查找某个元素是否出现。
函数模板:
binary_search(arr[], arr[]+size, target)
参数说明:
arr[]: 数组首地址
size:数组元素个数
target:需要查找的值
函数功能: 在数组中以二分法检索的方式查找,若在数组(要求数组元素非递减)中查找到indx元素则真,若查找不到则返回值为假。
二、lower_bound:查找第一个大于或等于某个元素的位置。
函数模板:
lower_bound(arr[],arr[]+size ,target)
参数说明:
arr[]: 数组首地址
size:数组元素个数
target:需要查找的值
函数功能: 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置(注意是地址)。如果所有元素都小于val,则返回last的位置

注意:函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置,且last的位置是越界的!值为n.
返回查找元素的第一个可安插位置,也就是“元素值>=查找值”的第一个元素的位置

三、upper_bound:查找第一个大于某个元素的位置。

函数模板:

upper_bound(arr[],arr[]+size , target)

参数说明:

arr[]: 数组首地址

size:数组元素个数

target:需要查找的值

函数功能:函数upper_bound()返回的在前闭后开区间查找的关键字的上界,返回大于val的第一个元素位置

  例如:一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:数组下标越界)

返回查找元素的最后一个可安插位置,也就是==“元素值>查找值”==的第一个元素的位置 。

#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;

int arr[100];

int main(){
	int n;
	scanf("%d",&n);
	for(int i = 0; i < n; ++i){
		scanf("%d",&arr[i]);
	}
	//二分查找必须是有序序列,所以在查找之前要排序 
	sort(arr,arr+n);
	int m;
	scanf("%d",&m);
	for(int i = 0;i < m; ++i){
		int target;
		scanf("%d",&target);
		//lower_bound获取的是地址值 
		int position = lower_bound(arr,arr + n,target)-arr;
		if(position != n && arr[position == target]){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值