(sort+结构体)成绩排序

sort 使用需#include<algorithm>

sort函数的3个参数:

1.需要排序数组的起始地址

2.需要排序数组的结束地址

3.排序函数 (若不写排序函数,默认为整数的从小到大排序)

sort(arr,arr+n,cmp);

对结构体排序的使用方法:

有一个node类型的数组node arr[100],想对它进行排序:

1.先按a值升序排列

2.如果a值相同,再按b值降序排列

3.如果b还相同,就按c升序排列。

就可以写这样一个比较函数:

struct node{
    int a;
    int b;
    double c;
};
bool cmp(node x,node y){
    if(x.a!=y.a) return x.a>y.a;
    if(x.b!=y.b) return x.b>y.b;
    return x.c<y.c;
}

例:给出n个学生的成绩,将这些学生按成绩排序,排序规则:总分高的在前;总分相同,数学成绩高的在前;总分与数学相同,英语高的在前;总分数学英语都相同,学号小的在前

输入格式

  第一行一个正整数n,表示学生人数
  接下来n行每行3个0~100的整数,第i行表示学号为i的学生的数学、英语、语文成绩
输出格式
  输出n行,每行表示一个学生的数学成绩、英语成绩、语文成绩、学号
  按排序后的顺序输出
样例输入
    2
    1 2 3
    2 3 4
样例输出
    2 3 4 2
    1 2 3 1
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h> 
#include <algorithm>
using namespace std;

int n,m;
int ans=0;
bool vis[105];
int dp[105],aa[105];
struct node{
    int id;
    int math;
    int eglish;
    int chinese;
    int all;
};
bool cmp(node x,node y){
    if(x.all!=y.all) return x.all>y.all;
    if(x.math!=y.math) return x.math>y.math;
    if(x.eglish!=y.eglish) return x.eglish>y.eglish;
    return x.id<y.id;
}
int main() {
    node arr[105];
    cin>>n;
    node stu;
    for(int i=0;i<n;i++){
        stu.id=i+1;
        cin>>stu.math>>stu.eglish>>stu.chinese;
        stu.all=stu.math+stu.eglish+stu.chinese;
        arr[i]=stu;
    }
    sort(arr,arr+n,cmp);
    for(int i=0;i<n;i++){
        cout<<arr[i].math<<" "<<arr[i].eglish<<" "<<arr[i].chinese<<" "<<arr[i].id<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xusi/p/12539958.html