结构体排序

针对结构体排序问题,分三步走:①声明结构体 ② 重新定义排序规则 ③主函数里面的读数据,利用sort()排序,及根据题意输出

以例题进行讲解:[NOIP2007 普及组] 奖学金 - 洛谷

这道题比较经典,题目较长,但不必害怕!!!

结构体排序_第1张图片

结构体排序_第2张图片 

结构体排序_第3张图片

 输入:先是输入学生总人数,后面每一行分别代表语文,数学,英语的成绩。

 输出 : 输出前5名学生的学号和总分。

①声明结构体,结构体里面定义的变量分别为:语文成绩,数学成绩,英语成绩,题目中还涉及总分,以及学号,故结构体声明如下:

#include 

using namespace std;

struct stu{
    int id; //学号
    int chinese; //语文成绩
    int math;  //数学成绩
    int english;  //英语成绩
    int score;  //总分
};

②重新定义排序规则:依据题意我们可以得知排序规则:

  (1)总分从高到低

  (2)总分相同时,语文成绩从高到低排

  (3)总分和语文成绩相同时,学号小的排在前面。

bool cmp(stu a, stu b){
    if(a.score != b.score){ //总分不同时,从高到低排
        return a.score > b.score;
    }else{ //总分相同时
        if(a.chinese != b.chinese){ //语文成绩不同,从高到低排
            return a.chinese > b.chinese;
        }else{ //总分和语文成绩相同时,学号小的往前排
            return a.id < b.id;
        }
    }
}

③主函数(读,sort排序,输出):

int main(){
    int n;
    cin >> n;
    stu s[n]; //定义结构体数组
    for(int i = 0; i < n; i++){
        int a, b, c;
        cin >> a >> b >> c; //a b c代表语文,数学,英语成绩
        int d = a + b + c; //d 代表总分
        s[i] = {i+1,a,b,c,d}; //结构体变量里面的每一个分量的值
    }
    sort(s,s+n,cmp); //利用sort排序
    //按照题意进行输出
    for(int i = 0; i < 5; i++){
    	cout << s[i].id << " " << s[i].score << endl; 
	}
	return 0;
    
}

总代码:

#include 

using namespace std;

struct stu{
    int id;
    int chinese;
    int math;
    int english;
    int score;
};
bool cmp(stu a, stu b){
    if(a.score != b.score){
        return a.score > b.score;
    }else{
        if(a.chinese != b.chinese){
            return a.chinese > b.chinese;
        }else{
            return a.id < b.id;
        }
    }
}
int main(){
    int n;
    cin >> n;
    stu s[n];
    for(int i = 0; i < n; i++){
        int a, b, c;
        cin >> a >> b >> c;
        int d = a + b + c;
        s[i] = {i+1,a,b,c,d};
    }
    sort(s,s+n,cmp);
    for(int i = 0; i < 5; i++){
    	cout << s[i].id << " " << s[i].score << endl; 
	}
	return 0;
    
}

结构体类型的题目其实是简单的,多做几道题目就好,刚开始的时候我也不明白。

在做题过程中,你需知道如何声明结构体,排序规则,以及数据的读取,排序,输出即可。

我上面写的代码是可以作为模板的,按照这个套路写就好。

类题如下:

生日 - 洛谷

[NOIP2009 普及组] 分数线划定 - 洛谷

宇宙总统 - 洛谷 (这道题与其他题有点不同,排序对象是字符串)

[NOIP2005 提高组] 谁拿了最多奖学金 - 洛谷(这道题绕的弯较多,弄清楚排序规则就好)

我把每道题目的代码以单独的文章贴出,大家可以进行一个对比。

你可能感兴趣的:(排序算法,结构体排序,排序算法,算法)