您的位置:首页 > 其它

三分检索(递归)

2017-05-26 14:21 92 查看
算法实验

#include<iostream>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<iomanip>
#include<fstream>
#include<vector>
#include<map>
using namespace std;
const int MAXN=1e4+10;
const int INF=0x3f3f3f3f;
map<int,bool> mp;
int a[MAXN];
int n,pos;

void gen()
{
int lb,ub;
srand((unsigned)time(NULL));
cout<<"请输入数据个数:";
cin>>n;
cout<<"请输入数据下限:";
cin>>lb;
cout<<"请输入数据上限:";
cin>>ub;
int tmp;
for(int i=1;i<=n;i++)
{
tmp=lb+rand()%(ub-lb+1);
if(!mp[tmp])
{
a[i]=tmp;
mp[tmp]=true;
}else
{
i--;
}
}
}

int trisearch(int L,int R,int key)
{
if(R<L) pos=-1;
else
{
int mid1=L+(R-L)/3;
int mid2=R-(R-L)/3;
if(key==a[mid1]) pos=mid1;
else if(key==a[mid2]) pos=mid2;
else if(key<a[mid1])
pos=trisearch(L,mid1-1,key);
else if(key>a[mid2])
pos=trisearch(mid2+1,R,key);
else
pos=trisearch(mid1+1,mid2-1,key);
}
return pos;
}

int main()
{
ios::sync_with_stdio(false);
while(true)
{
mp.clear();
gen();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
if(i%10==0) cout<<endl;
}
cout<<endl;
int key;
while(true)
{
cout<<"请输入要查找的数字: ";
cin>>key;
int ans=trisearch(1,n,key);
if(ans==-1) cout<<"查找失败"<<endl;
else cout<<"查找成功,该数字位于排序后的第"<<ans<<"位"<<endl;
cout<<endl;
cout<<"是否继续查找另外一个数字(Y/N):";
char ch;
cin>>ch;
if(ch=='N') break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: