【九度 OJ 09】二分查找学生信息

简介: 【九度 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);
        }
    }
}


目录
相关文章
|
5月前
|
算法
二分查找——OJ题(一)
二分查找——OJ题(一)
76 1
|
5月前
|
算法
二分查找——OJ题(二)
二分查找——OJ题(二)
71 0
|
3天前
【九度 OJ 08】简单查找x
【九度 OJ 08】简单查找x
4 0
|
5月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
34 1
|
5月前
|
存储 算法
常见的二叉树系统题解(二)
常见的二叉树系统题解(二)
|
5月前
|
存储 算法
常见的二叉树系统题解(一)
常见的二叉树系统题解(一)
|
5月前
剑指Offer LeetCode 面试题25. 合并两个排序的链表
剑指Offer LeetCode 面试题25. 合并两个排序的链表
31 0
|
12月前
|
算法
【LeetCode 算法专题突破】二分查找(⭐)
【LeetCode 算法专题突破】二分查找(⭐)
32 0