二分查询
建立在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码片