二分搜索技术

二分搜索技术

使用的前提是:有序的递增序列
算法分析:我们根据序列的有序性来判断序列中是否含有我们要找的值。
图解过程如下:
图片的前四章为查找数字17和最后一个为查找18(没有找到的情况)

wu

#incldue<iostream>
#incldue<algorithm>
using namespace std;

const int maxn=10000+5;
int A[maxn];//储存数据的序列
int n;//要输入的数组的长度
int Benary_search(int a)
{
	int left = 1;
	int right = n;
	while(left<=right)//如果当left和right和mid相等了以后都还不能等于a这是left+1或则right-1都会使得right<left
	{
		int mid=left+(right-left)/2;
		if(a>A[mid]) left=mid+1;
		else if(a<A[mid]) right=mid-1;
		else
			return 1;//如果返回的是数组下标则这里需要改为
			//return mid;
	}
	return 0;//没有找到返回0
}
int main()
{
	int a=0;
	cout<<"请输入序列的长度:");
	for(int i=1;i<=n;i++)
		cin>>A[i];
	sort(A,A+n);
	cout<<"请输入查找的元素a:";
	cin>>a;
	int t=Binary_Search(a);
	if(t)
		cout<<"该元素在数列中当中";
	else 
		cout<<"该元素不在数列中";
}
```c
//递归算法
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1000;
int A[maxn];
int search(int left,int right,int value)
{
	int mid;
	if(left<=right)
	{
		mid=left+(right-left)/2;//去中间值
		if(value==A[mid])//如果相等,则打印该数
		{
			printf("%d",mid);
			return 0;
		}
		else if(value>A[mid])//如果大于则返回后半段
			search(mid+1,right,value);
		else//如果小于则返回前半段
			search(left,mid-1,value);
	}
	else//没有找到返回-1
	{
		printf("-1\n");
		return 0;
	}
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&A[i]);
	int k;//输入要找的值
	scanf("%d",&k);
	search(1,n,k);
}
而现有的可以调用的二分查找函数为:
==binary_search( first, real, value);== //first 元素首地址; real元素末尾地址。value是要查找的函数的值。
如果元素存在于数种则返回true否则返回false。
==lower_bound(first , real , value )==
如果>=value返回第一个地址,可以利用则一点在返回的地址上减去 first指针极为数据在序列种的位置(一般已知该数必在序列中我们要知道它的位数)。
==upper_bound(first,real,value)==
如果>value返回第一个地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值