新建Student类,包括姓名、年龄、学号等属性。先对学生信息进行排序,然后实现如下输出。
1)要求按照学生姓名字典序从小到大排列并输出,如果姓名相同则按年龄从大到小排列。
1)要求按照学生姓名字典序从小到大排列并输出,如果姓名相同则按年龄从大到小排列。
2)利用二分查找法查找姓名为Emma的学生,并输出学生信息。
#include<iostream>
#include<algorithm>
using namespace std;
class Student{ //类的定义
public:
Student(){}
Student(string nam,int i,int a):name(nam),id(i),age(a){}
string name;
int id;
int age;
};
Student search(Student stu[],int low,int high,string key); //折半查找函数的声明
bool cmp(Student stu1,Student stu2){ //排序
if(stu1.name[0]!=stu2.name[0]) //姓名不相同时,返回姓名小的
return stu1.name<stu2.name;
else return stu1.age>stu2.age; //姓名相同时,返回年龄大的
}
int main(){
Student stu[5]={Student("Abc",33,12),Student("Adc",3,123),Student("Bas",3,21),Student("Dee",3,22),Student("Emma",3,9)};
sort(stu,stu+5,cmp);
for(int i=0;i<5;i++)
cout<<stu[i].name<<" "<<stu[i].id<<" "<<stu[i].age<<endl;
Student sss;
sss=search(stu,0,4,"Emma");
cout<<sss.name<<" "<<sss.id<<" "<<sss.age<<endl;
return 0;
}
Student search(Student *stu,int low,int high,string key){ //折半查找函数,递归实现,有数组,左右端点,查找目标
int mid=(low+high)/2;
if(key==stu[mid].name)
return stu[mid];
if(stu[mid].name>key)
return search(stu,low,mid-1,key);
else return search(stu,mid+1,high,key);
}