首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:205283 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩

都按先录入排列在前的规则处理。

例示:
jack      70
peter     96
Tom       70
smith     67

从高到低  成绩
peter     96
jack      70
Tom       70
smith     67

从低到高

smith     67

jack      70

Tom       70
peter     96

注:0代表从高到低,1代表从低到高

数据范围:人数:
进阶:时间复杂度:,空间复杂度:

输入描述:

第一行输入要排序的人的个数n,第二行输入一个整数表示排序的方式,之后n行分别输入他们的名字和成绩,以一个空格隔开



输出描述:

按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开

示例1

输入

3
0
fang 90
yang 50
ning 70

输出

fang 90
ning 70
yang 50
示例2

输入

3
1
fang 90
yang 50
ning 70

输出

yang 50
ning 70
fang 90
#coding=UTF-8
import sys
while True:
    try:
        num=int(sys.stdin.readline().strip())#人数
        flag=int(sys.stdin.readline().strip())#正序
        value_list=[]
        for i in range(0,num):
            item=[each for each in sys.stdin.readline().strip().split()]
            item[1]=int(item[1])
            value_list.append(item)
        if flag==0:
            sortlist=sorted(value_list,key=lambda x:x[1],reverse=True)
        else:sortlist=sorted(value_list,key=lambda x:x[1],reverse=False)
        for each in sortlist:
            print str(each[0])+' '+str(each[1])
    except Exception,e:
        # print e.message
        break

#python大法好

发表于 2017-08-23 19:43:09 回复(0)
//思路:利用结构体来进行存储,排序规则自定义compare函数,调用sort即可。
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
typedef struct Data
{
    int id;
    string name;
    int value;
};

bool compare0(Data d1,Data d2)//降序
{
    if(d1.value==d2.value)
        return d1.id<d2.id;
    return d1.value>d2.value;
}

bool compare1(Data d1,Data d2)//升序
{
    if(d1.value==d2.value)
        return d1.id<d2.id;
    return d1.value<d2.value;
}
int main()
{
    int n,flag;
    while(cin>>n>>flag)
    {
        vector<Data>dvec;
        int id=1;
        string name;
        int value;
        Data data;
        for(int i=0;i<n;++i)
        {
            cin>>name>>value;
            data.id=id++;
            data.value=value;
            data.name=name;
            dvec.push_back(data);
        }
        if(flag==0)
            sort(dvec.begin(),dvec.end(),compare0);
        else
            sort(dvec.begin(),dvec.end(),compare1);
        for(int i=0;i<n;++i)
            cout<<dvec[i].name<<" "<<dvec[i].value<<endl;
	}
    return 0;
}

编辑于 2017-05-04 19:28:15 回复(3)
归并排序,因为要求时间复杂度nlogn,稳定
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
vector<pair<string,int>> tmp;
void merge1(vector<pair<string,int>>& arr,int left,int mid,int right){
    int l=left,r=mid+1,idx=l;
    while(l<=mid && r<=right){
        if(arr[l].second<=arr[r].second){
            tmp[idx++]=arr[l++];
        }else{
            tmp[idx++]=arr[r++];
        }
    }
    while(l<=mid){
        tmp[idx++]=arr[l++];
    }
    while(r<=right){
        tmp[idx++]=arr[r++];
    }
    for(int i=left;i<=right;i++){
        arr[i]=tmp[i];
    }
}

void merge2(vector<pair<string,int>>& arr,int left,int mid,int right){
    int l=left,r=mid+1,idx=l;
    while(l<=mid && r<=right){
        if(arr[l].second>=arr[r].second){
            tmp[idx++]=arr[l++];
        }else{
            tmp[idx++]=arr[r++];
        }
    }
    while(l<=mid){
        tmp[idx++]=arr[l++];
    }
    while(r<=right){
        tmp[idx++]=arr[r++];
    }
    for(int i=left;i<=right;i++){
        arr[i]=tmp[i];
    }
}

void mergesort(vector<pair<string,int>>& arr,int left,int right,int method){
    if(left>=right) return;
    int mid=left+(right-left)/2;
    mergesort(arr, left, mid, method);
    mergesort(arr, mid+1, right, method);
    if(method) merge1(arr,left,mid,right);//从低到高
    else merge2(arr,left,mid,right);//从高到低
    
}

int main() {
    int n,method;
    cin>>n>>method;
    vector<pair<string, int>> arr;
    tmp=vector<pair<string,int>>(n);
    while(n--){
        string name;int core;
        cin>>name>>core;
        arr.push_back({name,core});
    }
    mergesort(arr, 0, arr.size()-1, method);
    for(auto p:arr){
        cout<<p.first<<' '<<p.second<<endl;
    }
    return 0;
}


发表于 2022-08-03 15:39:27 回复(0)
import java.util.*;
public class Main{
    static class Student{
        private String name;
        private Integer res;
        public Student(String name,Integer res){
            this.name = name;
            this.res = res;
        }
        public String getName(){
            return this.name;
        }
        public Integer getRes(){
            return this.res;
        }
        public void out(){
            System.out.println(this.name+" "+this.res);
        }
    }
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int flag = sc.nextInt();
            List<Student> list = new ArrayList<Student>();
            for(int i =0 ;i < n; i++){
                String name = sc.next();
                int res = sc.nextInt();
                list.add(new Student(name,res));
            }
            for(int i = 0; i< list.size()-1; i++ ){
                for(int j =0; j< list.size()-1-i; j++){
                    if( flag ==1?list.get(j).getRes()>list.get(j+1).getRes():
                       list.get(j).getRes()<list.get(j+1).getRes()){
                        Student tmp = list.get(j);
                        list.set(j,list.get(j+1));
                        list.set(j+1,tmp);
                    }
                }
            }
            for(Student s:list){
                s.out();
            }
        }
    }
}
以上.

发表于 2022-02-24 18:12:35 回复(0)
flag设为全局变量,一次cmp
#include<vector>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;

struct Student{
    string name;
    int score;
    int index;
};
int flag;

bool cmp(Student a, Student b){
    if(flag == 1 && a.score!=b.score) return a.score<b.score;
    else if(flag == 0 && a.score!=b.score) return a.score>b.score;
    return a.index< b.index;
}

int main(){
    int n;
    while(cin>>n){
        int score;
        string name;
        cin>>flag;
        vector<Student> stu;
        for(int i=0;i<n;i++){
            cin>>name>>score;
            stu.push_back({name,score,i});
        }
        sort(stu.begin(),stu.end(),cmp);
        for(int i=0;i<n;i++)
            cout<<stu[i].name<<' '<<stu[i].score<<endl;
    }
}

发表于 2022-01-12 21:03:57 回复(0)
import java.util.*;

class Node2 {

    int score;
    String name;

    public Node2(String name, int score) {
        this.name = name;
        this.score = score;
    }

}

public class Main {


    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        while (scanner.hasNext()) {

            int n = scanner.nextInt(), way = scanner.nextInt();
            List<Node2> list = new ArrayList<>(n);

            for (int i = 0; i < n; i++) {
                list.add(new Node2(scanner.next(), scanner.nextInt()));
            }

            if (way == 1) {
                Collections.sort(list, (l1, l2) -> {
                    return l1.score - l2.score;
                });
            } else {
                Collections.sort(list, (l1, l2) -> {
                    return l2.score - l1.score;
                });
            }

            for (Node2 node2 : list) {
                System.out.println(node2.name + " " + node2.score);
            }
            
        }
    }
}

发表于 2021-07-22 12:15:29 回复(0)
//使用Arrays的sort排序,重写比较方法
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int pattern=sc.nextInt();
            String[][] table=new String[n][2];
            for(int i=0;i<n;++i){
                table[i][0] = sc.next();
                table[i][1] = sc.next();
            }
            MyComparator1 myCom1=new MyComparator1();
            MyComparator2 myCom2=new MyComparator2();
            Arrays.sort(table,pattern==1?myCom1:myCom2);
            for(int i=0;i<n;++i){
                System.out.print(table[i][0]+" "+table[i][1]);
                System.out.println();
            }
        }
    }
}
class MyComparator1 implements Comparator<String[]>{
    public int compare(String[] s1, String[] s2){
        return Integer.parseInt(s1[1])-Integer.parseInt(s2[1]);
    }
}
class MyComparator2 implements Comparator<String[]>{
    public int compare(String[] s1, String[] s2){
        return Integer.parseInt(s2[1])-Integer.parseInt(s1[1]);
    }
}
发表于 2021-05-24 21:04:07 回复(0)
import java.util.Scanner;
import java.util.Arrays;

/* 成绩排序,重写字符串排序比较器*/
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        while (in.hasNextLine()) {
            int n = Integer.parseInt(in.nextLine());
            int order = Integer.parseInt(in.nextLine());

            String[] arr = new String[n];
            for (int i = 0; i < n; i++)
                arr[i] = in.nextLine();

            Arrays.sort(arr, (s1, s2) -> {
                int i1 = Integer.parseInt(s1.split(" ")[1]);
                int i2 = Integer.parseInt(s2.split(" ")[1]);
                return order == 0 ? i2 - i1 : i1 - i2;
            });

            for (String s : arr)
                System.out.println(s);
        }

        in.close();
    }
}

编辑于 2021-04-12 15:14:08 回复(0)
直接读入一条条记录到成绩列表中,一条记录用(顺序号,姓名,成绩)这个三元组来表示。然后对成绩列表的成绩和顺序号进行二次排序就可以了。
while True:
    try:
        n = int(input())
        method = int(input())
        scores = []
        for i in range(n):
            name, score = input().strip().split()
            score = int(score)
            scores.append([i, name, score])
        sign = -1 if method == 0 else 1
        scores = sorted(scores, key=lambda x: [sign*x[-1], x[0]])
        for record in scores:
            print(f"{record[1]} {record[2]}")
    except:
        break
发表于 2021-03-24 17:56:26 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int num = scanner.nextInt();
            int order = scanner.nextInt();
            List<Integer> grades = new ArrayList<>();
            List<String>[] names = new ArrayList[101];
            for (int i = 0; i < num; i++){
                String name = scanner.next();
                int grade = scanner.nextInt();
                grades.add(grade);
                if (names[grade] == null){
                    names[grade] = new ArrayList<>();
                }
                names[grade].add(name);
            }
            Collections.sort(grades, new Comparator<Integer>(){
                public int compare(Integer entry1, Integer entry2){
                    if (order == 0){
                        return entry2 - entry1;
                    }else{
                        return entry1 - entry2;
                    }
                }
            });
            for (Integer e : grades){
                System.out.println(names[e].get(0) + " " + String.valueOf(e));
                names[e].remove(0);
            }
        }
    }
}

发表于 2021-01-29 14:18:54 回复(0)

Python 解法

if __name__ == "__main__":
    while True:
        try:
            n = int(input())
            t = int(input())
            data = [input().strip().split() for i in range(n)]
            data.sort(key=lambda x: int(x[1]),reverse = not t)#排序的关键字是int(x[1]),直接x[1]会报错
            for l in data:
                print(" ".join(l))
        except:
            break
发表于 2020-09-22 23:34:11 回复(0)
自己利用造对象的方式通过了。
import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            int len=sc.nextInt();
            int sort=sc.nextInt();
            Set<Person> set=new TreeSet<>(new Comparator<Person>() {
                @Override
                public int compare(Person o1, Person o2) {
                    if (sort==0){
                        if(o1.score!=o2.score)
                            return -(o1.score-o2.score);
                        else return 1;//return 1表示分数相同时,按照插入顺序添加对象
                    }else {
                        if(o1.score!=o2.score)
                             return o1.score-o2.score;
                        else return 1;
                    }

                }
            });

            for(int i=0;i<len;i++){
                set.add(new Person(sc.next(),sc.nextInt()));
            }

            for(Person p:set){
                System.out.println(p.name+" "+p.score);
            }
        }
    }
}

class Person{
    public String name;
    public int score;
    public Person(String name,int score){
        this.name=name;
        this.score=score;
    }
}


发表于 2020-08-27 21:19:44 回复(0)
定义一个类,存放姓名和成绩,然后定义两个比较函数,调用带谓词的sort排序即可。
需要注意的是,因为成绩相同时,排名次序不能变,因此需要用稳定排序,不能用sort,改成stable_sort即可。

代码:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Student{
public:
    Student(){};
    Student(string s, int i):name(s),soc(i){}
    Student(const Student &st)
    {
        this->name = st.name;
        this->soc = st.soc;
    }
    
    static bool myup(const Student &s1, const Student &s2)
    {
        return s1.soc < s2.soc;
    }

    static bool mydown(const Student &s1, const Student &s2)
    {
        return s1.soc > s2.soc;
    }
    
    string name;
    int soc;
};


int main()
{
    int num, flag;
    while(cin >> num)
    {
        cin >> flag;
        vector<Student> arr(num);
        for(int i = 0; i < num; i++)
            cin >> arr[i].name >> arr[i].soc;
        
        if(flag)
            stable_sort(arr.begin(), arr.end(), Student::myup);
        else
            stable_sort(arr.begin(), arr.end(), Student::mydown);
        
        for(int i = 0; i < arr.size(); i++)
            cout << arr[i].name <<" "<< arr[i].soc << endl;
    }

    return 0;
}


编辑于 2020-07-27 18:26:10 回复(0)
import java.util.*;
import java.io.*;

public class Main{
    public static void main(String[] args)throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String csbr;
        while((csbr=br.readLine())!=null){
            int n = Integer.parseInt(csbr);
            int mathod = Integer.parseInt(br.readLine());
            LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
            for(int i=0;i<n;i++){
                String[] ss = br.readLine().split(" ");
                String name=ss[0];
                int score = Integer.parseInt(ss[1]);
                map.put(name+" "+score,score);
            }
            ArrayList<Map.Entry<String,Integer>> list = new ArrayList<Map.Entry<String,Integer>>(map.entrySet());
            Collections.sort(list,new Comparator<Map.Entry<String,Integer>>(){
                public int compare(Map.Entry<String,Integer> s1,Map.Entry<String,Integer> s2){
                    if(mathod==0){
                        return -(s1.getValue()-s2.getValue());
                    }
                    return s1.getValue()-s2.getValue();
                }
            });
            for(int i=0;i<list.size();i++){
                System.out.println(list.get(i).getKey());
            }
        }
    }  
}

发表于 2020-07-13 19:17:19 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    for(int n,p;cin>>n>>p;){
        vector<pair<string,int>> vec(n);
        for(auto &user:vec) cin>>user.first>>user.second;
        if(!p) stable_sort(vec.begin(),vec.end(),
                [](const pair<string,int>& p1, const pair<string,int>& p2){return p1.second > p2.second;});
        else stable_sort(vec.begin(),vec.end(),
               [](const pair<string,int>& p1, const pair<string,int>& p2){return p1.second < p2.second;});
        for(auto user:vec) cout << user.first << ' ' << user.second << endl;
    }
}
    😑4ms
发表于 2020-06-27 12:46:48 回复(0)
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>

using namespace std;

void display(const pair<int, vector<string>>& p)
{
    const vector<string> & v = p.second;
    for (const auto &name : v) {
        cout <<  name << " " << p.first << endl;
    }
}

int main(void)
{
    int n;
    int flag;
    string name;
    int score;

    map<int, vector<string>> mapScore;
    while (cin >> n >> flag) {
        mapScore.clear();
        while (n--) {
            cin >> name >> score;
            mapScore[score].push_back(name);
        }
        if (flag == 0) { // 从大到小
            for_each(mapScore.rbegin(), mapScore.rend(), display);
        } else if (flag == 1) { //从小到大
            for_each(mapScore.begin(), mapScore.end(), display);
        }
    }
    return 0;
}

编辑于 2020-06-20 15:06:12 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n=sc.nextInt();
            int b=sc.nextInt();
            LinkedHashMap<String,Integer> map = new LinkedHashMap<String,Integer>();
            for (int i = 0; i <n ; i++) {
                String name=sc.next();
                int score=sc.nextInt();
                map.put(name+" "+score,score);
            }
            //用键值对排序
            List<Map.Entry<String, Integer>> list = new ArrayList<>(map.entrySet());
            if(b==0){//降序
                Collections.sort(list, (o1,o2)->(o2.getValue()-o1.getValue()));
            }else if(b==1){//升序
                Collections.sort(list, (o1,o2)->(o1.getValue()-o2.getValue()));
            }
            for(Map.Entry<String, Integer> entry:list){
                System.out.println(entry.getKey());
            }
        }
        sc.close();
    }

}

发表于 2020-03-20 18:41:03 回复(2)
#include<vector>
(721)#include<string>
#include<iostream>
(720)#include<stdlib.h>
#include<algorithm>
using namespace std;

typedef struct student
{
	string name;
	int score;
};

void  Grade_Sort(vector<student> &ans,int &sort_flag)
{
	//  执行成绩排序

	student temp;
	for (int i = 0; i < ans.size() - 1; i++)
	{
		for (int j = 0; j < ans.size() - 1; j++)
		{
			if (sort_flag)
			{
				if (ans[j].score > ans[j+1].score)
				{
					temp = ans[j];
					ans[j] = ans[j + 1];
					ans[j + 1] = temp;
				}
			}
			else
			{
				if (ans[j].score < ans[j + 1].score)
				{
					temp = ans[j];
					ans[j] = ans[j + 1];
					ans[j + 1] = temp;
				}
			}
		}
	}
}

int main()
{
	vector<student> ans;
	int num;
	student  stu;
	int sort_flag;
	while (cin >> num)
	{
		cin >> sort_flag;
		for (int i = 0; i < num; i++)
		{
			cin >> stu.name >> stu.score;
			ans.push_back(stu);
		}

		Grade_Sort(ans, sort_flag);

		//循环打印
		for (auto it = ans.begin(); it != ans.end(); it++)
		{
			cout << it->name << ' ' << it->score << endl;
		}
		// 清空容器
		ans.clear();
	}
	system("pause");
	return 0;
}

发表于 2020-03-07 19:25:56 回复(1)

用map和map<greater>分别装一下就行了,让他自己排序</greater>

#include<iostream>
(720)#include<map>

using namespace std;

int main() {
    int num;
    while(cin >> num) {
        int mod;
        cin >> mod;
        if(mod == 0) {
            string name;
            int scor;
            multimap<int, string, greater<int>> ismap;
            while(num--) {
                cin >> name >> scor;
                ismap.insert(pair<int, string>(scor, name));
            }
            for(auto m : ismap) {
                cout << m.second << ' ' << m.first << endl;
            }
        }
        else {
            string name;
            int scor;
            multimap<int, string> ismap;
            while(num--) {
                cin >> name >> scor;
                ismap.insert(pair<int, string>(scor, name));
            }
            for(auto m : ismap) {
                cout << m.second << ' ' << m.first << endl;
            }
        }
    }

    return 0;
}
发表于 2020-02-23 14:39:07 回复(0)
虽然说是一种很笨的办法(因为框架集合不熟练),但是觉得应该会对有需要的人有帮助
思路还是将名字+成绩放在第一个数组,成绩放在第二个数组,按成绩大小来输出第一个数组

import java.util.*;
public class Main{
  public static void main(String[] args){
    Scanner key =new Scanner(System.in);
    while(key.hasNext()){
      int num = key.nextInt();
      int way = key.nextInt();
      String[] array = new String[num];
      int[] array1 =new int[num];
      for(int i=0;i<num;i++){
        String temp = key.next();
        int temp1 = key.nextInt();
        String temp2 = temp+" "+temp1;
        array[i]=temp2;
        array1[i]=temp1;
      }
      if(way==0){
        for(int j=0;j<num;j++){
        int max = array1[num-1];
        int we = num-1;
        for(int i=num-1;i>=0;i--){
          if(array1[i]>=max){
            max = array1[i];
            we=i;
          }
        }
          System.out.println(array[we]);
          array1[we]=-1;
      }
      }
      if(way==1){
        for(int j=0;j<num;j++){
          int min = array1[num-1];
          int we = num-1;
          for(int i=num-1;i>=0;i--){
            if(array1[i]<=min){
              min = array1[i];
              we = i;
            }
          }
          System.out.println(array[we]);
          array1[we]=100000;
        }
      }
    }
  }
}

发表于 2020-02-06 12:19:55 回复(0)