#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <iomanip>
using namespace std;
const int MAX =110;
int yao[MAX];
int erfen1(int left,int right,int x) //二分递归实现
{
if(left>right)
return -1;
int middle=(left+right)/2;
if(yao[middle]==x)
return middle;
else if(yao[middle]>x)
erfen1(left,middle-1,x);
else
erfen1(middle+1,right,x);
}
int erfen2(int left,int right,int x) //二分非递归实现
{
int middle=-1;
while(left<=right)
{
middle=(left+right)/2;
if(yao[middle]==x)
return middle;
else if(yao[middle]>x)
right=middle-1;
else
left=middle+1;
}
return -1;
}
struct FLAG
{
int right;
bool if_have;
};
struct FLAG erfen3(int left,int right,int x) //如果找到了x就返回相应的位置,且FLAG.if_have 是true,如果没有找到,就返回刚好比x的那个数的位置,且FLAG.if_have=false
{
struct FLAG flag;
flag.if_have=false;
while(left<=right)
{
int mid=(left+right)/2;
if(yao[mid]==x)
{
flag.if_have=true;
flag.right=mid;
return flag;
}
if(yao[mid]>x&& yao[mid-1]<x)
{
flag.if_have=false;
flag.right=mid;
return flag;
}
else if(yao[mid]<x)
left=mid+1;
else
right=mid-1;
}
flag.if_have=false; //x比最大的数都大,做标记
flag.right=-1;
return flag;
}
int main() //测试
{
yao[0]=17;
yao[1]=13;
yao[2]=134;
yao[3]=111;
yao[4]=120;
yao[5]=121;
yao[6]=142;
yao[7]=152;
yao[8]=12;
sort(yao,yao+9);
for(int i=0;i<9;i++)
printf("%5d",i);
cout<<endl;
for(int i=0;i<9;i++)
printf("%5d",yao[i]);
cout<<endl;
int temp;
while(cin>>temp)
{
cout<<"输入1测试函数1"<<endl;
cout<<"输入2测试函数2"<<endl;
cout<<"输入3测试函数3"<<endl;
int temp2;
cin>>temp2;
switch(temp2)
{
case 3:
{
if(true==erfen3(0,8,temp).if_have)
cout<<"找到了这个数,他是第"<<erfen3(0,8,temp).right<<"个数"<<endl;
else
{
if(-1==erfen3(0,8,temp).right)
cout<<"你要查找的数比最大的数还大"<<endl;
else
cout<<"你要查找的数在第"<<erfen3(0,8,temp).right<<"数的前面"<<endl;
}
break;
}
case 2:
{
if(-1==erfen2(0,8,temp))
cout<<"木有找到这个数"<<endl;
else
cout<<"在第:"<<erfen2(0,8,temp)<<"个位置"<<endl;
break;
}
case 1:
{
if(-1==erfen2(0,8,temp))
cout<<"木有找到这个数"<<endl;
else
cout<<"在第:"<<erfen2(0,8,temp)<<"个位置"<<endl;
break;
}
}
}
system("pause");
}
二分查找
最新推荐文章于 2021-04-24 16:45:18 发布