改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。
//二分查找
#include <bits/stdc++.h>
using namespace std;
int search(vector <int> a,int n,int m){
int i = 0;
int j = 0;
int detection = -1; //标志位
int middle =0; //中间值的下标
int top = n-1; //数组的右边界
int low = 0; //数组的左边界
while (low <= top)
{
middle = (low + top)/2; //先计算该数组中间值下标
if (a[middle] == m) //如果中间值等于要搜索的元素,则将标志位标记为中间值下标
detection=middle;
if (a[middle] < m) //如果中间值小于要搜索的元素,即要查询元素在中间值右边,则将要查询数据左边界改成中间值之后一个的数据
{
low=middle+1;
}
else //如果中间值大于要搜索的元素,即要查询元素在中间值左边,则将要查询数据左边界改成中间值之前一个的数据
{
top=middle-1;
}
}
if (detection == -1) //如果m没有在其中,则执行完,top为底,low为顶,m在中间。
{
i = top;
j = low;
}
else
{
i = detection;
j = i;
}
if(i==j) cout<<"数字的位置在:"<<i;
else {
cout<<"数字不在此数组中"<<endl;
cout<<"i="<<i<<endl<<"j="<<j<<endl;
}
return 0;
}//二分搜索m
int main(){
vector <int> a;
int number;
cout<<"输入一个由小到大排序的数组:"<<endl;
while (1)
{
cin>>number;
a.push_back(number); //每输入一个数字将其添加到数组的最后
if(cin.get() == '\n') //输入回车 跳出循环
break;
}
int n = a.size();
int m;
//sort(a.begin(),a.end(),greater<int>()); //由大到小排序
//sort(a.begin(),a.end()); //默认由小到大
cout<<"输入要查找的数字:"<<endl;
cin>>m;
search(a,n,m);
return 0;
}