首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:44851 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
用一维数组存储学号和成绩,然后,按成绩排序输出。

输入描述:
输入第一行包括一个整数N(1<=N<=100),代表学生的个数。
接下来的N行每行包括两个整数p和q,分别代表每个学生的学号和成绩。


输出描述:
按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来。
如果学生的成绩相同,则按照学号的大小进行从小到大排序。
示例1

输入

3
1 90
2 87
3 92

输出

2 87
1 90
3 92
通过重载小于号< ,不需要重写cmp函数
#include <stdio.h>
#include <algorithm>
using namespace std;
struct E
{
    int num;
    int score;
    bool operator < (const E &b)const{
        if(score!=b.score)return score<b.score;
        else return num<b.num;
    }
}buf[101];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;++i)
        {
            scanf("%d %d",&buf[i].num,&buf[i].score);
        }
    }
    sort(buf,buf+n);
    for(int i=0;i<n;++i)
    {
        printf("%d %d\n",buf[i].num,buf[i].score);
    }
    return 0;
}
发表于 2018-01-09 17:24:20 回复(0)
Java 解法一,使用面向对象的写法,清晰
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        ArrayList<Student> list = new ArrayList<>();
        for (int i = 0; i < n; i++) list.add(new Student(scanner.nextInt(),scanner.nextInt()));
        Collections.sort(list);
        for (Student student : list) System.out.println(student);
    }
    
    public static class Student implements Comparable<Student>{
        Integer id;
        Integer score;

        public Student(Integer id,Integer score){
            this.id=id;
            this.score=score;
        }
        @Override
        public int compareTo(Student o) {
           return this.score.equals(o.score) ?id.compareTo(o.id):score.compareTo(o.score);
        }
        @Override
        public String toString() {
            return id+" "+score;
        }
    }
}
解法二:
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine();
        ArrayList<String> list = new ArrayList<>();
        for (int i = 0; i < n; i++) list.add(scanner.nextLine());
        list.sort((o1, o2) -> {
            String[] s1 = o1.split(" ");
            Integer id1 = Integer.parseInt(s1[0]);
            Integer score1= Integer.parseInt(s1[1]);
            String[] s2 = o2.split(" ");
            Integer score2= Integer.parseInt(s2[1]);
            Integer id2 = Integer.parseInt(s2[0]);
            return score1.equals(score2) ?id1.compareTo(id2):score1.compareTo(score2);
        });
        for (String s : list) System.out.println(s);
    }
}



编辑于 2020-03-17 16:45:03 回复(1)
#include<stdio.h>>
int main(){
    int n,a[200],i,j,k;
    while(~scanf("%d",&n)){
        for(i=0;i<2*n;i++)
            scanf("%d",&a[i]);
        for(i=1;i<(2*n-2);i+=2){
            for(j=i+2;j<2*n;j+=2){
                if(a[j]<=a[i]){
                    k=a[j-1];
                    a[j-1]=a[i-1];
                    a[i-1]=k;
                    k=a[j];
                    a[j]=a[i];
                    a[i]=k;
                }
            }
        }
        for(i=0;i<2*n;i++){
            printf("%d ",a[i]);
            if((i+1)%2==0)
                printf("\n");
        }
    }   
}

发表于 2021-06-15 12:46:21 回复(0)
temp记录名词,如果相等判断学号,大的temp也加一,用新数组存成绩和学号,按照名次排序

#include<stdio.h>
int main()
{
int i,j,k,temp=0;
int a[100],b[100],c[100],d[100];
scanf("%d",&i);
for(j=0;j<i;j++)
{
    scanf("%d %d",&a[j],&b[j]);
    }    
    for(j=0;j<i;j++)
    {
        for(k=0;k<i;k++)
        {
        if(b[j]>b[k])temp++;
        else if(b[j]==b[k]&&a[j]>a[k])temp++;
    }
    c[temp]=b[j];
    d[temp]=a[j];
    temp=0;
}
    for(j=0;j<i;j++)
    {
        printf("%d %d\n",d[j],c[j]);
    }
    return 0;
}

发表于 2021-03-23 11:20:14 回复(0)
/*
*定义cmp ,vector排序。
*/


#include<bits/stdc++.h>

using namespace std;

vector<pair<int,int> > v;
int n;

bool cmp(pair<int, int> a, pair<int, int> b)
{
    if(a.second == b.second) return a.first < b.first;
    return a.second < b.second;
}

int main()
{
    int x, g;
    while(scanf("%d",&n) == 1) 
    {
        for(int i = 0;i < n; i++)
        {
            scanf("%d%d",&x,&g); v.push_back(make_pair(x, g));
        }
        sort(v.begin(), v.end(), cmp);
        for(int i = 0;i < n; i++)
        {
            printf("%d %d\n",v[i].first,v[i].second); 
        }
    }
    return 0;
}


发表于 2021-01-19 15:05:33 回复(0)
用结构体,冒泡排序。

#include<iostream>
using namespace std;
struct student{
	int id;
	int grade;
};
int main(){
	student stu[100];
	int N;
	cin>>N;
	for(int i=0;i<N;i++){
		cin>>stu[i].id>>stu[i].grade;
	}
	for(int i=0;i<N-1;i++){
		for(int j=0;j<N-i-1;j++){
			if(stu[j].grade>stu[j+1].grade){
				student item=stu[j];
				stu[j]=stu[j+1];
				stu[j+1]=item;
			}
			if(stu[j].grade==stu[j+1].grade){
				if(stu[j].id>stu[j+1].id){					
					student item=stu[j];
					stu[j]=stu[j+1];
					stu[j+1]=item;			
				}
			}
		}
	}
	
	for(int i=0;i<N;i++){
		cout<<stu[i].id<<" "<<stu[i].grade<<endl;
	}
	return 0;
}


发表于 2020-03-19 19:46:26 回复(0)
/*STL就是好用*/

#include<iostream>
(720)#include<algorithm>
#include<vector>
using namespace std;
struct student
{
    int id;
    int grade;
};
bool cmp(student a,student b)
{
    return (a.grade==b.grade)?(a.id<b.id):(a.grade<b.grade);
}
int main()
{
    
    int n,i;
    while(cin>>n)
    {
        vector<student> ve(n);
        for(i=0;i<n;i++)
        {
            cin>>ve[i].id>>ve[i].grade;
        }
        sort(ve.begin(),ve.end(),cmp);
        for(i=0;i<n;i++)
        {
            cout<<ve[i].id<<" "<<ve[i].grade<<endl;
        }
    }
    return 0;
}

发表于 2020-03-17 17:36:04 回复(0)

用一个二维数组记录;score_record[i][j].
score_record[i][]记录成绩等于i的学生的学号,学号按照从小到的顺序排列,使用插入排序。

#include<stdio.h>

void swap(int *a,int *b) 
{
    int temp;
    temp=*a;
    *a=*b;
    *b=temp;
}

int main(){
    int score_record[101][101]={0};
    int N,i,j,id,score,index;
    while(scanf("%d",&N) != EOF){
        for(i=0; i<N; i++){
            scanf("%d%d",&id,&score);
            if(score_record[score][0] == 0){
                score_record[score][0] = 1;
                score_record[score][1] = id;
            }
            else{
                index = ++score_record[score][0];
                score_record[score][index] = id;
                while(index>1){
                    if(score_record[score][index]<score_record[score][index-1]){
                        swap(&score_record[score][index], &score_record[score][index-1]);
                        index--;
                    }
                    else{
                        break;
                    }
                }
            }
        }
        for(score=0; score<101; score++){
            for(j=1; j<=score_record[score][0]; j++){
                printf("%d %d\n",score_record[score][j],score);
            }
        } 
    }

}
发表于 2019-12-30 12:12:00 回复(0)
和之前有名字的排序差不多  注意成绩相同按学号从小到大排就好了
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int main(void)
{
    int n,s;
    while(cin>>n)
    {
        int score[n],a[n],no[n],b[n];
        int i,j;
        i=0;
        while(i<n)
        {
            cin>>no[i]>>score[i];
            a[i]=score[i];
            b[i]=no[i];
            i++;
        }
        sort(b,b+n);
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                if(b[i]==no[j])
                {
                    score[i]=a[j];
                }
        sort(a,a+n);
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
                if(score[j]==a[i]){
                    cout<<b[j]<<" "<<score[j]<<endl;
                    score[j]=-1;
                    break;
                }
        }
    }
    return 0;
}
发表于 2019-11-15 23:28:29 回复(0)
// 定义学生类,重载<号
// 使用STL的动态数组vector,和sort函数

#define _CRT_SECURE_NO_WARNINGS
 
#include<algorithm>
#include<cstdio>
#include<vector>
 
using namespace std;
 
struct Stu {
    int no;
    int grade;
 
    Stu(int no, int grade) :no(no), grade(grade) {}
 
    int operator < (Stu b) {
        if (this->grade != b.grade)
            return this->grade < b.grade;
        return this->no < b.no;
    }
};
 
int main() {
    int n, no, grade;
    vector<Stu> v;
    while (scanf("%d", & n) == 1) {
        v.clear();
        for (int i = 0; i < n; i++) {
            scanf("%d%d", &no, &grade);
            v.push_back(Stu(no, grade));
        }
        sort(v.begin(), v.begin() + n);
        for (int i = 0; i < n; i++) {
            printf("%d %d\n", v[i].no, v[i].grade);
        }
    }
 
    return 0;
}


发表于 2019-08-10 16:04:29 回复(0)
//每一轮取保存分数最小值对应的下标,当一轮中最小值不止一个时,则保存学号小的下标;然后依靠下标输出对应的学号和分数

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int* sn=new int[n+2];
int* score=new int[n+2];
int min;
int k=0;
for(int i=0;i<n;i++){
cin>>sn[i]>>score[i];
}
for(int j=0;j<n;j++){
min=999;
for(int i=0;i<n;i++){
if(score[i]<min){
min=score[i];
k=i;
}
else if(score[i]==min){
if(sn[i]<=sn[k])
k=i;
}
}
cout<<sn[k]<<" "<<score[k]<<endl;
score[k]=9999;
}
return 0;
}
发表于 2019-03-10 03:04:13 回复(0)
#include<stdio.h>
#include<malloc.h>

void swap(int* a, int* b){
    int temp = 0;
    temp = *a;
    *a = *b;
    *b = temp;
} 

int main(){
    int n = 0;    //人数
    while(scanf("%d", &n) != EOF){
        int *number = (int *) malloc (sizeof(int) * n);    //学号
        int *grade = (int *) malloc (sizeof(int) * n);    //成绩
        for(int i = 0; i < n; i++){
            scanf("%d", &number[i]);
            scanf("%d", &grade[i]);
        }
        for(int i = 0; i < n - 1; i++)
            for(int j = 0; j < n - 1 - i; j++){    //冒泡排序 
                if(grade[j] > grade[j + 1]){
                    swap(&grade[j], &grade[j + 1]);
                    swap(&number[j], &number[j + 1]);
                } 
                if(grade[j] == grade[j + 1])
                    if(number[j] > number[j + 1]){
                        swap(&grade[j], &grade[j + 1]);
                        swap(&number[j], &number[j + 1]);
                    }  
            }

        for(int i = 0; i < n; i++)
            printf("%d %d\n", number[i], grade[i]);
        free(number);
        free(grade);
    }
    return 0;
}
发表于 2019-01-01 19:13:42 回复(1)
while True:
    try:
        num = int(input())
        students = []
        for i in range(num):
            students.append(list(map(int,input().split())))
        students.sort(key=lambda x:(x[1],x[0]))
        for j in students:
            print('%d %d'%(j[0],j[1]))
    except Exception:
        break
编辑于 2018-10-10 23:59:27 回复(0)
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    vector<int> v(101,101);//(学号,成绩)
    for(int i=0;i<n;i++){
        int p,q;
        cin>>p>>q;
        v[p]=q;
    }
    for(int j=1;j<101;j++){
        for(int k=0;k<v.size();k++){
            if(v[k]==j){
                cout<<k<<' '<<j<<endl;
            }
        }
    }
    return 0;
}

编辑于 2018-09-03 00:05:58 回复(2)
两次排序:先排学号,再排成绩
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main
{
    public static void main(String... args)
    {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt())
        {
            int cases = sc.nextInt();
            List<String> list = new ArrayList<>(cases);
            while (cases-- != 0)
                list.add(sc.next() + "-" + sc.next());
            list.sort((a, b) -> Integer.parseInt(a.substring(0, a.indexOf("-"))) - Integer.parseInt(b.substring(0, b.indexOf("-"))));
            list.sort((a, b) -> a.substring(a.indexOf("-") + 1).compareTo(b.substring(b.indexOf("-") + 1)));

            for (String s : list)
                System.out.println(s.replace("-", " "));
        }
        sc.close();
    }
    
}

发表于 2018-08-05 11:49:16 回复(0)
#include <stdio.h>
#include <stdlib.h>

typedef struct student{
    int num;
    int score;
}student;

int cmp(const void *a,const void *b){
    if ((*(student *)a).score > (*(student *)b).score)
        return 1;// 分数大的在后面,1表示需要调换
    else if((*(student *)a).score == (*(student *)b).score)
        if((*(student *)a).num > (*(student *)b).num)
            return 1;
        else
            return 0;
    else 
        return -1;
}


int main()
{
    student st[100];
    int i,N;
    while(scanf("%d", &N) != EOF){
        for(i=0; i<N; i++){
            scanf("%d %d", &st[i].num, &st[i].score);
        }
        qsort(st, N,sizeof(st[0]), cmp);
        for(i=0; i<N; i++){
            printf("%d %d\n", st[i].num,st[i].score);
        }
    }
    return 0;
}

发表于 2018-03-05 15:23:43 回复(0)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
struct student
{
	unsigned id;
	unsigned score;
};
int main()
{
	int stdCount;
	cin >> stdCount;
	vector<student> vec;
	while (0 < stdCount--)
	{
		student s;
		cin >> s.id >> s.score;
		vec.push_back(s);
	}
	auto f = [](const student& s1, const student& s2)->bool {if (s1.score != s2.score)return s1.score < s2.score;
	return s1.id < s2.id; };
	sort(vec.begin(), vec.end(), f);
	for (auto& e : vec)
		cout << e.id << " " << e.score << endl;
	return 0;
}

发表于 2017-04-21 16:42:18 回复(0)
#include<stdio.h>
struct student
{
    int id;
    int score;
};
void swap(struct student *s,int j)
{
    struct student t;
    t=s[j];
    s[j]=s[j-1];
    s[j-1]=t;
    return ;
}
int main()
{
    int N;  /* N个学生*/
    int i,j;
    struct student s[100];
    while(scanf("%d",&N)!=EOF)
    {   //录入学生信息
        for(i=0;i<N;i++)
        {
            scanf("%d %d",&s[i].id,&s[i].score);
        }
        //排序
        for(i=0;i<N;i++)
            for(j=N-1;j>i;j--)
            {
                if(s[j].score<s[j-1].score)
                    swap(s,j);
                else if(s[j].score==s[j-1].score)
                {
                    if(s[j].id<s[j-1].id)
                        swap(s,j);
                }
            }
        for(i=0;i<N;i++)
        {
            printf("%d %d\n",s[i].id,s[i].score);
        }
    }
    return 0;
}


发表于 2017-02-21 09:29:19 回复(0)
#include<stdio.h> 
int main()
{
struct student
{
int num;
int grade;
}student[3] = { { 1, 85 }, { 2, 78 }, { 3, 95 } },t;  //定义结构体数组,数组中的元素为结构体,并初始化
int i;
for (i = 0; i <= 2; i++)
printf("%d,%d\n", student[i].num, student[i].grade);
for (i = 0; i <= 1; i++)
if (student[i].grade > student[i + 1].grade)
{
t = student[i];
student[i] = student[i + 1];
student[i + 1]=t;//实现交换
}
for (i = 0; i <= 2; i++)
printf("%d,%d\n", student[i].num, student[i].grade);
}

发表于 2016-03-17 19:26:52 回复(1)
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct node{
    int stu;
    int grade;
}student;
void sort(student s[],int N){
    student t;
    for(int i = 0;i < N - 1;i++){
        for(int j = 0;j < N - 1 - i;j++){
            if(s[j + 1].grade < s[j].grade){
                t = s[j + 1];
                s[j + 1] = s[j];
                s[j] = t;
            }else if(s[j + 1].grade == s[j].grade && s[j + 1].stu < s[j].stu){
                t = s[j + 1];
                s[j + 1] = s[j];
                s[j] = t;
            }
        }
    }
}
int main(){
    int N;
    cin>>N;
    student s[N];
    for(int i = 0;i < N;i++){
        cin>>s[i].stu;
        cin>>s[i].grade;
    }
    sort(s,N);
    for(int i = 0;i < N;i++){
      cout<<s[i].stu<<" "<<s[i].grade<<endl;
    }
    return 0;
}


发表于 2016-03-06 22:48:54 回复(2)