遍历/顺序查找
题目:输入若干个数,查找某个数的索引值
思路:存储为数组,输出数组下标即可
int n,x,j;
int buf[200];
cin>>n;
for(int i=0;i<n;i++)
cin>>buf[i];
cin>>x;
for(j=0;j<n;j++){
if(buf[j]==x){
cout<<j;
break;
}
}
二分查找/折半查找
顺序查找效率不高,若数据有序的情况下可用二分查找
查找过程为:将n个元素分成个数基本相同的两半,取第[n/2]的元素与欲查找的x作比较,如果x=[n/2]则找到x,算法终止。如果x<a[n/2](假设元素升序排序),则我们继续在数组的左半部继续搜索x;如果x>[n/2],则在数组的右半部继续搜索x…
题目
输入N个学生信息,
格式: 学号 姓名 性别 年龄
如: 01 李江 男 21
输入学号,需输出对应信息
思路
利用结构体存储学生信息,依据学号对学生信息进行排序,采用二分查找找到所需学生信息
结构体定义
struct stu{
char no[20];
char name[20];
int age;
char sex[5];
bool operator < (const stu & a) const{//重载<运算符
return strcmp(no,a.no) < 0;
}
}buf[100];
也可不用<的重载,用compare函数实现对学号的排序
cin>>n;
for(int i=0;i<n;i++){
cin>>buf[i].no>>buf[i].name>>buf[i].sex>>buf[i].age;
}
sort(buf,buf+n);//按学号no升序排序
cin>>m;//m 次查询
while(m--!=0){
int ans=-1;
char x[20];
cin>>x;
int l=0,r=n-1;
while(l<=r){
int mid=(l+r)/2;
int tmp=strcmp(buf[mid].no,x);
if(tmp==0){
ans=mid;
break;
}
else if(tmp>0)
r=mid-1;
else
l=mid+1;
}
if(ans==-1){//查找失败
cout<<"No Answer!\n";
}
else
cout<<buf[ans].no<<"\t"<<buf[ans].name<<"\t"<<buf[ans].sex<<"\t"<<buf[ans].age<<endl;
运行结果