简单介绍二分法!

二分法的介绍:
二分法是数学里面较为常见的算法之一,那它的原理是什么,怎样实现的呢,这里就只以 c++ 的语言来做简单的实现与说明:
若想运用二分法,其基础条件:目标对象是一串数(一个数就没什么意义而言了),而且这串数已经实现了简单排序(以升序为例)。假如有一个数组a,下标从0开始,(1, 2 ,3, 4,5 ,6);现在你要通过二分法的方法来查找一个你认为可能存在的元素。比如你要查找5这个数字,该数组中存在 5 这个元素而且它的数组下标是 4,其实这个问题不用二分法也可以简单得出(嗯哼,还是回到主题)。
而二分法是将你要查找的范围无限向两端极限逼近,什么意思呢?我们可以这样子来理解:就以这道题为例,设置三个计数位置的变量:begin(最前端),mid(中间端),end(最末端)。 这道题最前端是数组的下标 0 ,最末端是(元素个数-15,中间端是对 (begin + end )/2 取整 ,所以 初始值分别为 begin = 0,mid = 2,end = 5。 要查找的数设为 x = 5 通过上面我们可以知道 a[ mid ] = a [ 2 ] = 3x > a[ 2 ] 所以我们只要查找下标闭区间是 mid+1 ~end 的范围就可以,但是这样子好像还是不能精确找出 x 这个数的位置,我们显而易见就想到了通过赋值来实现搜索区间的缩小。这时候 end 的大小不变,但是 begin 的大小我们就改为 mid+1 ,范围就瞬间缩小了近一半,此时的 mid 值也要依照 endbegin 的变化而变化
在这里插入图片描述
如图所示, 就相当于 b1—> b2 ,e1---->e2 (但end 还是没变), m1—>m2;
即 begin = mid +1 ;
end改变;
mid = int(begin + end);

现在问题来了,难道要这样子一直循环吗?判断出口的条件是什么呢?
我们说应该分两种情况讨论:无非就是找到了 和 没找到这两种结果
1. 找到了
找到了最终结果一定是 a[ mid ] = x ,此时 mid 就是要找的数的数组下标位置。
(不做详细说明了,应该很好懂的)
2. 没找到
没找到的话就要考虑一个条件了,比如上面的数组变成 1 2 3 4 5 7,你现在查找的数是 x = 6 ;演示一遍过程:
在这里插入图片描述
结果若干次的begin或end 或 mid 的赋值 ,最后一定变成了 begin = end 这种情况,简单明了,看上面的演示图可以肯定该数组不存在你要查找的数,得出结论:不存在!
如果一开始查找的 x 在 初始 a[ mid ] 的左边 ,演示方法是一样的。
说完了。当然解这种简单题肯定不需要二分法了,不然复杂化了。
通过以上的叙述,相信大家应该能很快理解它,希望这次说明能给大家以后带来帮助。
现在将代码贴上来:

在这里插入代码片
#include<iostream>
//#include<cmath>
using namespace std;

int main()
{
	int a[100];
	int n,i;
	int flag=0;
	cout<<"a数组元素的个数:"<<endl;
	cin>>n; 
	cout<<"请输入已经排序好的a数组里面的元素:"<<endl;
	for(i=0;i<n;i++)
		cin>>a[i];
	int x;
	cout<<"请输入要查找的元素:"<<endl;
	cin>>x;
	int begin=0,end=n-1,mid;
	for(i=0;i<n-1;i++)
	{
		mid=(begin+end)/2;
		if(x==a[mid])
		{
			cout<<"nice,找到了,"<<x<<"在数组从左至右的第"<<mid+1<<"号位置"<<endl;
			return 0;
		}		
		if(x<a[mid])
		{
			end=mid-1;
			mid=(begin+end)/2;
			if(begin!=end);
			else
			{
				flag=1;
				break;
			}
		}
		if(x>a[mid])
		{
			begin=mid+1;
			mid=(begin+end)/2;
			if(begin!=end);
			else
			{
				flag=1;
				break;
			}
		}
	}
	if(flag==1)
		cout<<"Sorry,你要查找的"<<x<<"不存在"<<endl;	
	return 0;
} 

有错误欢迎指出,谢谢!

发布了6 篇原创文章 · 获赞 6 · 访问量 474

猜你喜欢

转载自blog.csdn.net/YSJ367635984/article/details/103858730
今日推荐