C++ 查找

遍历/顺序查找

题目:输入若干个数,查找某个数的索引值
思路:存储为数组,输出数组下标即可

 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;
  

运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值