C++中的【分治算法】二分查找(详细解析)

目录

了解二分查找

数字炸弹

它的过程

样例题目

题目描述

输入

输出

样例输入

样例输出

这个就是二分查找【分治算法】,Code


 

了解二分查找

二分查找顾名思义,就是一半一半地去找指定的那个数,如一个数组(当然,给的这个数组一定是有序的)arr={1,2,3,4,5},我要找5,我得先看他的一半是小于五还是怎么样,如果说,他是小于5的(原本就是),他的左边界就应该等于一半的这个下标

数字炸弹

你们玩过数字炸弹吗?二分查找就像是玩数字炸弹一样~

数字炸弹,就是在1~100内随机取一个数,要想在最短次数内找到,不能从左往右依次去找(麻烦),从右往左也是不行的,这个时候,我们就要用到二分查找法了!

它的过程

了解了它的工作了,接下来就该想一想该怎么弄了,代码+注释:

while(1){//while循环
	len=(l+r)/2;//取中间数加标
	if(a[len]==m){//判断,如果大于M(指定的数)
		int i=len;//i先等于中间数
		while(a[i]==m){
			i--;//循环i--,如果a[i]等于m,i--,为了找到第一个为指定数的下标
		}
		cout<n*10){//如果次数过多,就证明没有!
		break;
	}
}

样例题目

题目描述

给出有 n 个元素的由小到大的序列,请你编程找出某元素第一次出现的位置。(n<=10^6) 

输入

第一行:一个整数,表示由小到大序列元素个数;下面 n 行,每行一个整数;最后一行一个整数 x,表示待查找的元素;

输出

如果 x 在序列中,则输出 x 第一次出现的位置,否则输出-1。

样例输入

5
3
5
6
6
7
6

样例输出

3

这个就是二分查找【分治算法】,Code

#include
using namespace std;
int main()
{
	//输入 
	int n;
	cin>>n;
	int m,a[n];
	for(int i=0;i>a[i];
	cin>>m;
	
	//二分查找
	int len,l=n,r=0,s=0;
	while(1){
		len=(l+r)/2;
		if(a[len]==m){
			int i=len;
			while(a[i]==m){
				i--;
			}
			cout<n*10){
			break;
		}
	}
	cout<<-1;
	
	//程序成功 
	return 0;
}

点个赞,谢谢

你可能感兴趣的:(C++,c++)