二分查询(分治策略)

二分查询

建立在ar是有序的情况下
在这里插入代#include<stdio.h>
#include<iostream>
#include<vector>
#include<map>
#include<unordered_map>//无序map
#include<assert.h>
using namespace std;
int BinaryFindValue(int* ar, int n, int val)//循环的二分查询
{
	assert(ar != NULL);
	//nullptr为关键字NULL为宏定义
	//nullptr可以被自动转换为各种pointer类型,但不会转换为任何整形类型,而NULL与0的作用相似,表示空数据
	int pos = -1;
	int left = 0, right = n - 1;
	while (left <= right)//left<right是错误的,注意条件
	{
		//int mid = (right + left) / 2;
		int mid = (right - left) / 2 + left;
		if (val < ar[mid])
		{
			right = mid - 1;
		}
		else if (val > ar[mid])
		{
			left = mid + 1;
		}
		else  
		{
			/*while (mid>left&&ar[mid - 1] == val)//找到最左边的val;
			{
				mid = mid - 1;
			}
			pos = mid;
			break;*/ //不适用于有很多的相同val
			if (ar[mid - 1] != val)
			{
				pos = mid;
				break;
			}
			right = mid - 1;
		}
	}
	return pos;

}
递归的二分查询

int FindValue(const int*ar, int left, int right,int val)
{
	int pos = -1;
	if (left <= right)
	{
		int mid = (right - left) / 2 + left;
		if (val < ar[mid])
		{
			pos=FindValue(ar,left, mid - 1,val);
		}
		else if(val > ar[mid])
		{
			pos=FindValue(ar, mid + 1, right,val);
		}
		else 
		{
			pos = mid;
			
		}
	}
	return pos;
}
int BinFindValue(const int* ar, int n, int val)//递归方式
{
	assert(ar != NULL);
	return FindValue(ar, 0, n - 1,val);
}
int main()
{
	int ar[] = { 12,23,34,45,56,67,78,89,90,100 };
	int n = sizeof(ar) / sizeof(ar[0]);
	int val;
	cin >> val;
	//int pos = BinaryFindValue(ar,n,val);//循环
	int pos = BinFindValue(ar, n, val);
	cout << pos << endl;
	return 0;


 }
#endif码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值