【九度 OJ 09】二分查找学生信息
文章目录
一、题意
二、解答过程
思路:
二分查找
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct student//用于表示学生的结构体
{
char sno[100];//学号
char name[100];//姓名
char sex[10];//性别
int age;//年龄
//结构体内嵌的比较函数
bool operator < (const student &b) const//比较函数,使其能够进行sort函数排序
{
return strcmp(sno,b.sno)<0;
}
}buf[1000];
int main()
{
int n,m;
char x[100];
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%s %s %s %d",&buf[i].sno,&buf[i].name,&buf[i].sex,&buf[i].age);
}
sort(buf,buf+n);//对数组排序,使其按照学号升序排序
scanf("%d",&m);
while(m--!=0)
{
int ans=-1;
scanf("%s",&x);//输入待查找学号
int top=n-1,base=0;//开始下标为0,结束下标为n-1,查找整个数组
int cnt=1;
while(top>=base)
{
int mid=(top+base)/2;//计算中间点下标
int tmp=strcmp(buf[mid].sno,x);//比较中间学号与目标学号
if(tmp==0)
{
ans=mid;
break;//若相等则完成跳出二分查找
}
else if(tmp<0)base=mid+1;//若小于,则开始下标变为中间节点后一个点坐标
else top=mid-1;//若大于,则结束下标变为中间节点前一点下标
printf("%d\t",mid);
printf("%d\t",cnt++);
}
if(ans==-1)printf(" not find");//查找失败
else printf("%s %s %s %d\n",buf[ans].sno,buf[ans].name,buf[ans].sex,buf[ans].age);
}
}
}