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<<i+2<<endl;//输出,Q1:为什么-2不是-1?A1:因为不等的时候减了1,为了和实际一样得多+1(数组是由下标为0开始的)
		return 0;//结束
	}
	else if(a[len]<m){//如果小于的话,指定的数应该在右边
		r=len;//现在的左边界就应该是中间值
	}
	else{
		l=len;//否则右边界等于中间值(当指定的数在左边时)
	}
	s++;//次数自增
	if(s>n*10){//如果次数过多,就证明没有!
		break;
	}
}

样例题目

题目描述

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

输入

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

输出

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

样例输入

5
3
5
6
6
7
6

样例输出

3

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

#include<iostream>
using namespace std;
int main()
{
	//输入 
	int n;
	cin>>n;
	int m,a[n];
	for(int i=0;i<n;i++) cin>>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<<i+2<<endl;
			return 0;
		}
		else if(a[len]<m){
			r=len;
		}
		else{
			l=len;
		}
		s++;
		if(s>n*10){
			break;
		}
	}
	cout<<-1;
	
	//程序成功 
	return 0;
}

点个赞,谢谢

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
分治算法是一种将问题分解为更小部分并递归求解的算法。而二分查找分治算法的一种应用。在二分查找,我们首先将数组分成两部分,然后判断待查找的数与元素的大小关系,进而确定待查找数在哪一部分,然后再在该部分进行递归查找。这种方法能够快速地定位到待查找数。 在给出的C代码实现,我们可以看到二分查找算法的递归实现。代码通过比较待查找的数与元素的大小关系,来决定是继续在左半部分还是右半部分进行查找。如果找到了待查找数,则返回对应的索引值;如果没有找到,则返回-1。 在提供的测试代码,我们可以看到如何调用二分查找函数来查找数组元素。通过传入数组的地址、查找范围的最小下标和最大下标以及待查找的数,我们可以得到该数在数组的索引值。 所以,根据分治算法二分查找的实现原理,我们可以使用C语言来实现分治算法二分查找。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C/C++ 分治算法(二分查找算法递归实现)](https://blog.csdn.net/cpp_learner/article/details/126613516)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值