【算法教程】【C/C++】二分查找——程序设计思路与代码实现

faryou6个月前 (06-01)技术教程

前言

        在信奥中,二分算法是一种非常重要的方法。利用它,我们在某些场合中寻找数时就不必要遍历数组,大大提高了效率。今天我们来学习二分算法的基本方法。


程序设计思路

        有这样一个问题:给你一个数组,数组里面的数已经按数值大小倒序排列,请从中找到某个数,要求不得遍历数组。

        这里需要注意,数组里的数已经降序排列,这一点对我们要进行的查找是有帮助的。我们可以利用数之间的大小关系,进行查找。比如说,可以先找到数组中间的那个数,与基准数(要找的数)进行比较。如果基准数大于这个数,那么我们就可以确定基准数在这个数的左侧,反之则在这个数的右侧。这样一直循环,直到找到基准数。

        这就是二分查找的精髓。


代码实现

        直接看题:

IMG_20240821_172631.png

        这是二分算法的模板题,思路已经有了,直接上代码——

#include <bits/stdc++.h>

int a[1000005],n,m,aq;//a存输入的数据,n、m同题意,aq临时存要查找的数

int search(int iq){
	int left=1,right=n,mid=(1+n)/2;//确定左指针、右指针、中央
	while(left<right){//当左右指针相遇时,循环结束
		mid=(left+right)/2;
		if(a[mid]>=iq) right=mid;
		else left=mid+1;
	}//不断更新左、右、中指针
	if(a[left]==iq) return left;
	else return -1;
}

int main(){//main里全是输入和输出,不讲了
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++){
		scanf("%d",&aq);
		printf("%d ",search(aq));
	}
	return 0;
}

        可以看到,这里使用了左右两个指针解决问题。程序并不难写,关键在思路。


总结

        二分算法是一种能够大大提升查找效率的方法。之后我还会为大家带来由二分算法衍生出的二分答案和三分算法。我是faryou,再见!

本文链接:https://blog.faryou.eu.org/post/100.html 转载需经作者授权!

分享到:

扫描二维码推送至手机访问。

版权声明:本文由faryou的博客发布,如需转载请注明出处。

本文链接:https://blog.faryou.eu.org/post/100.html

标签: C++算法基础
分享给朋友:

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。