2025暑期8.1第7次课课程总结

最后更新于 2025-08-02 21:31:15
作者
分类 个人记录

我们已知的查找方式有枚举,排序查找等,但枚举时间耗时长,排序查找能找的过于单一,所以二分查找兼备了耗时少,运用广泛的特点,但缺点是数组必须从小到大或从大到小,我们可以与sort搭配来进行查找

二分查找

也称折半查找。

假设我们有一个数组,1~n(n=100)

我们先猜中间数50,假设我们查的数大于50,那么我们猜75,反之猜25,以此类推。

而这种方法只需log(n)次

思路及代码

1、我们先定义一个长度为n的数组并给每项赋值,再输入我们要查的x

2、再定义l和r,将l设为1-1,r设为n+1(查找范围的边界)

3、我们之后用while来判断循环,如果l+1项小于r就循环

4、循环中找中间的位置(向下取整),如果中间项的值小于我们找的数,那么把l设为中间值反之设r为中间值,如果查找的数等于中间值,将答案设为中间的位置,跳出循环

int l = 0, r = n + 1; // 将l设为1 - 1,r设为n + 1
while(l + 1 < r){
    int mid = (l + r) / 2;//中间位置公式:首位+末尾/2
    if(a[mid] < x){//如果中间值小于查找的数
        l = mid;//l设为中间位置
    }
    else if(a[mid] > x){//如果中间值大于查找的数
        r = mid;//r设为中间位置
    }
    else{
        ans = mid; 
        break;//记录答案并跳出循环
    }
}

D3237 【入门】二分查找

思路及细节

1、输入n和每一项,再输入查找的数x

2、用二分查找找出x在数组中的位置,注:答案要设成-1,因为如果找不到,那么输出-1

(只要会二分,这题纯水)

最终代码

#include<bits/stdc++.h>
using namespace std;
long long a[1000005];
int main(){
	long long x,n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>x;
	long l=1-1,r=n+1,ans=-1;
	while(l+1<r){
		long long cnt=(l+r)/2;
		if(a[cnt]>x){
			r=cnt;
		}else if(a[cnt]<x){
			l=cnt;
		}else{
			ans=cnt;
			break;
		}
	}
	cout<<ans;
	return 0;
}

完工