二分查找相关知识点
2025-02-08 16:55:41
发布于:上海
二分查找(又称折半查找)
基础二分查找作用:在有序序列中查找  或  的前驱/后继
*注意:一定要在有序序列中查找
先来讲述一下如何在有序序列中查找  或  的前驱/后继
一般需要一个左端点,一个右端点,一个中间值(作为下标,然后在这个区间内进行寻找);每次查看中间值是否为的前驱/后继,然后改变左端点的值或右端点的值。
*改变左/右端点的值:比如说,在单调递增序列中寻找  的值
A8019.查找x: https://www.acgo.cn/problemset/info/8019
#include<bits/stdc++.h>//万能头
using namespace std;
int a[105];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];//输入
	int x;
	cin>>x;
	int left=1;
	int right=n;
    //二分查找的左端点和右端点有很多种写法,这里是一种(比较简单且容易理解的)左闭右闭区间[],也就是将数据范围分为三个部分
    //[left,mid-1][mid][mid+1,right]
	int ans=-1;
    //ans(answer)记录答案,初始值按照题目要求改为-1
	while(left<=right){
		int mid=(left+right)/2;
		if(a[mid]==x){
            //如果找到要求值,记录下来,退出循环
			ans=mid;
			break;
		}else if(a[mid]<x){ 
            //[left,mid-1][mid][mid+1,(x,)right](发现x在第三个部分,将左端点转移到mid+1,在[mid+1,right]之间查找)
			left=mid+1;
		}else if(a[mid]>x){
			right=mid-1;
             //[left,(x,)mid-1][mid][mid+1,right](发现x在第一个部分,将右端点转移到mid-1,在[left,mid-1]之间查找)
		}
	}
	cout<<ans;
}
一些其他的相关知识:
lower_bound:
 lower_bound(a(数组名)+第一个下标,a+最后一个下标+1,x(查找目标))-a(建议先减a,不然返回的是地址);
写出来就是:
lower_bound(a+1,a+1+n,x)
找到则返回第一个大于等于x的值的位置,找不到则返回最后一个下标+1
upper_bound:
 upper_bound(a(数组名)+第一个下标,a+最后一个下标+1,x(查找目标))-a(建议先减a,不然返回的是地址);
写出来就是:
upper_bound(a+1,a+1+n,x)
找到则返回第一个大于x的值的位置,找不到则返回最后一个下标+1
这里空空如也







有帮助,赞一个