在编程珠矶上面看见一道题目:
原始的二分查找太过容易了,试试这样一个版本:把t在数组x中第一次出现的位置返回给p(如果存在多个t的话,原始算法会任意返回其中一个)。要求代码对数组元素进行对数次比较。
原始二分算法
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int size=100005;
int N;
int arr[size];
int BSearch(int left,int right,int num)
{
if(left>right||num<arr[left]||num>arr[right])
return -1;
int mid=(left+right)/2;
if(arr[mid]==num) //如果找到了这个数,就退出
return mid;
if(arr[mid]>num)
return BSearch(left,mid-1,num);
else if(arr[mid]<num)
return BSearch(mid+1,right,num);
}
int main()
{
freopen("1.txt","r",stdin);
while(scanf("%d",&N)!=EOF)
{
for(int i=1;i<=N;++i)
scanf("%d",&arr[i]);
int number; //录入要输入的数据
scanf("%d",&number);
int pos=BSearch(1,N,number);
cout<<pos<<endl;
}
return 0;
}
返回第一个满足的位置
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int size=100005;
int N;
int arr[size];
int BinarySearch_first_pos(int left,int right,int num)
{
if(left>right||arr[left]>num||arr[right]<num)
return -1;
int mid=(left+right)/2;
if(arr[mid]==num)
{
if(arr[mid-1]!=num)
return mid;
else
return BinarySearch_first_pos(left,mid-1,num);
}
if(arr[mid]>num)
return BinarySearch_first_pos(left,mid-1,num);
else if(arr[mid]<num)
return BinarySearch_first_pos(mid+1,right,num);
}
int main()
{
freopen("1.txt","r",stdin);
while(scanf("%d",&N)!=EOF)
{
for(int i=1;i<=N;++i)
scanf("%d",&arr[i]);
int number;
scanf("%d",&number);
int pos=BinarySearch_first_pos(1,N,number);
cout<<pos<<endl;
}
return 0;
}