首页 > 试题广场 >

成绩排序

[编程题]成绩排序
  • 热度指数:220788 时间限制: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
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        // 读取学生人数
        int n = in.nextInt();

        // 读取排序方式
        int sortType = in.nextInt();

        // 创建学生数组
        String[] names = new String[n];
        int[] scores = new int[n];

        // 读取学生信息
        for (int i = 0; i < n; i++) {
            names[i] = in.next();
            scores[i] = in.nextInt();
        }

        // 两层循环实现冒泡排序
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if ((sortType == 0 && scores[j] < scores[j + 1]) || (sortType == 1 && scores[j] > scores[j + 1])) {
                    // 交换成绩
                    int tempScore = scores[j];
                    scores[j] = scores[j + 1];
                    scores[j + 1] = tempScore;
                    // 交换名字
                    String tempName = names[j];
                    names[j] = names[j + 1];
                    names[j + 1] = tempName;
                }
            }
        }
        // 输出排序后的学生信息
        for (int i = 0; i < n; i++) {
            System.out.println(names[i] + " " + scores[i]);
        }

        in.close();
    }
}

发表于 2024-10-19 11:52:16 回复(0)
// 算法复杂度O(nlogn)空间复杂度o(n);
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int flag = Integer.parseInt(br.readLine());

        Map<Integer, List<String>> map = new HashMap<>();

        String str;
        while ((str = br.readLine()) != null && !str.isEmpty()) {
            String[] strs = str.split(" ");
            int key = Integer.parseInt(strs[1]);
            List<String> names = map.getOrDefault(key, new ArrayList<>());
            names.add(strs[0]);
            map.put(key, names);
        }

        int[] nums = new int[map.size()];
        int index = 0;

        for (int key : map.keySet()) {
            nums[index++] = key;
        }

        Arrays.sort(nums);

        if (flag == 1) {  // 升序输出
            for (int i : nums) {
                for (String name : map.get(i)) {
                    System.out.println(name + " " + i);
                }
            }
        } else {
            for (int i = nums.length - 1; i >= 0; i--) {
                int key = nums[i];
                for (String name : map.get(key)) {
                    System.out.println(name + " " + key);
                }
            }
        }
    }
}

发表于 2024-09-01 20:35:21 回复(0)
TreeMap, 成绩做key,, 值存名字的list
import java.util.Scanner; 
import java.util.Map;
import java.util.TreeMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int sort = in.nextInt();
            Comparator<Integer> comparator = sort == 0 ? (x, y) -> y - x : Integer::compareTo;
            Map<Integer, List<String>> map = new TreeMap<>(comparator);
            for (int i = 0; i < n; i++) {
                String name = in.next();
                int score = in.nextInt();
                map.computeIfAbsent(score, k -> new ArrayList<String>()).add(name);
            }
            map.forEach((k,v) -> {
                for (String s : v) {
                    System.out.println(s + " " + k);
                }
            });
        }
    }
}


发表于 2024-07-18 16:49:58 回复(0)

思路:利用桶排序

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int sum = in.nextInt();
        int sort = in.nextInt();
        //数组的角标即为成绩,利用桶排序
        Student[] stu = new Student[101];
        for (int i = 0; i < sum; i++) {
            String name = in.next();
            int score = in.nextInt();
            //每个类记录相同分数的所有名字
            if (stu[score] == null) {
                stu[score] = new Student(name);
            } else {
                stu[score].addName(name);
            }
        }
        //从小到大,正序输出student数组
        if (sort == 1) {
            for (int i = 0; i <= 100; i++) {
                if (stu[i] != null) {
                    //遍历每个类内部所有的名字
                    for (int j = 0; j < stu[i].point; j++) {
                        System.out.println(stu[i].name[j] + " " + i);
                    }
                }
            }
        //从大到小,倒序输出
        } else {
            for (int i = 100; i >= 0; i--) {
                if (stu[i] != null) {
                    for (int j = 0; j < stu[i].point; j++) {
                        System.out.println(stu[i].name[j] + " " + i);
                    }
                }
            }
        }

    }
}
//对每个分数建立名字列表,以保证相同成绩时,保持输入的顺序
class Student {
    String[] name = new String[200];
    //每个类内部维护记录名字的数组
    int point = 0;
    public Student(String name) {
        this.name[point++] = name;
    }
    public void addName(String name) {
        this.name[point++] = name;
    }
}
发表于 2024-07-08 22:06:16 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = Integer.parseInt(in.nextLine());
        Student.sortMethod = Integer.parseInt(in.nextLine());
        Student[] students = new Student[n];
        for (int i = 0; i < n; i++) {
            String[] s = in.nextLine().split(" ");
            students[i] = new Student(i, s[0], Integer.parseInt(s[1]));
        }
        Arrays.sort(students);
        for (Student student : students) {
            System.out.println(student.name + " " + student.score);
        }
    }
}

class Student implements Comparable<Student> {
    int i;
    String name;
    int score;
    public static int sortMethod;

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

    @Override
    public int compareTo(Student o) {
        int s = Integer.compare(this.score, o.score);
        if (sortMethod == 0) {
            s = -s;
        }
        if (s != 0) {
            return s;
        }
        return Integer.compare(this.i, o.i);
    }
}
是很难看,但是过了啊(
发表于 2024-06-21 22:41:45 回复(0)
import java.util.*;

import static java.lang.Integer.parseInt;


class Person {
private String name;
private int score;

public Person(String name, int score) {
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public int getScore() {
return score;
}
}
class PersonAgeComparator implements Comparator<Person> {
@Override
public int compare(Person o1, Person o2) {
return o2.getScore()-o1.getScore() ;
}
}

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
HashMap<Integer,String> map=new HashMap<>();

while(sc.hasNext()){
//人数
int n = parseInt(sc.nextLine());
//排序方式
int sort_way= parseInt(sc.nextLine());//1是升序,0是降序
//姓名编号,成绩
Person[] people=new Person[n];

for(int i=0;i<n;i++){
String[] nameAndScore = sc.nextLine().split(" ");
String name=nameAndScore[0];
int score=parseInt(nameAndScore[1]) ;
people[i]=new Person(name,score);
}
Arrays.sort(people,new PersonAgeComparator());
for(int i=0;i<n;i++){
System.out.println(people[i].getName() + " " +people[i].getScore());
}
}
}
}
编辑于 2024-04-12 15:31:44 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int flag = in.nextInt();

            List<String[]> list = new ArrayList();
            for (int i = 0; i < n; i++) {
                String[] arr = new String[2];
                arr[0] = in.next();
                arr[1] = in.next();
                list.add(arr);
            }



            if (flag == 0) {
                list.sort(new Comparator<String[]>() {
                    @Override
                    public int compare(String[] o1, String[] o2) {
                        if (Integer.valueOf(o1[1]) > Integer.valueOf(o2[1])) {
                            return -1;
                        } else if (Integer.valueOf(o1[1]) < Integer.valueOf(o2[1])) {
                            return 1;
                        }
                        return 0;
                    }
                });
                for (int i = 0; i < n; i++) {
                    System.out.println(list.get(i)[0] + " " + list.get(i)[1]);
                }
            } else if (flag == 1) {
                list.sort(new Comparator<String[]>() {
                    @Override
                    public int compare(String[] o1, String[] o2) {
                        if (Integer.valueOf(o1[1]) > Integer.valueOf(o2[1])) {
                            return 1;
                        } else if (Integer.valueOf(o1[1]) < Integer.valueOf(o2[1])) {
                            return -1;
                        }
                        return 0;
                    }
                });
                for (int i = 0; i < n; i++) {
                    System.out.println(list.get(i)[0] + " " + list.get(i)[1]);
                }
            }
        }
    }
}


为什么难度是较难😀
发表于 2024-03-25 18:42:47 回复(0)
//stream流真的很爽,注意名字可能重复,传一个数组进去就可以避免这个问题
import java.util.*;
public class Main {
    private static Map<String[],Integer> map = new LinkedHashMap<>();
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int num = Integer.parseInt(sc.nextLine());
         int index = Integer.parseInt(sc.nextLine());
        for(int i = 0; i < num; i++){
            String[] strs = sc.nextLine().split(" ");
            map.put(strs, Integer.parseInt(strs[1]));
        }
        map.entrySet().stream().sorted((o1, o2) -> {
            if(index == 0){
                return o2.getValue() - o1.getValue();
            }else{
                return o1.getValue() - o2.getValue();
            }
        }).forEach(o1 -> System.out.println(o1.getKey()[0] + " " + o1.getValue()));
    }
}
编辑于 2024-03-22 19:20:46 回复(0)
道理我都懂,但这题目说,“相同成绩都按先录入排列在前的规则处理”
编辑于 2024-03-22 15:44:57 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {

    static class Item {
        public String name;
        public Integer score;
        public Integer index;
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt(), s = in.nextInt();
        List<Item> list = new ArrayList();
        int c = 0;
        while (n -- > 0) {
            Item item = new Item();
            item.index = ++ c;
            item.name = in.next();
            item.score = in.nextInt();
            list.add(item);
        }
        Collections.sort(list, (r1, r2) -> {
            if (r1.score == r2.score) return r1.index.compareTo(r2.index);
            return s == 1 ? r1.score.compareTo(r2.score) : r2.score.compareTo(r1.score);
        });
        list.forEach(item -> System.out.println(item.name + " " + item.score));
    }
}

编辑于 2024-03-16 19:22:26 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        int asc = in.nextInt();
        in.nextLine();
        String[] names = new String[count];
        int[] scores = new int[count];
        int[] ordered = new int[count];
        for(int i=0;i<count;i++){
            String[] arr = in.nextLine().split("\\s+");
            names[i] = arr[0];
            scores[i] = Integer.parseInt(arr[1]);
            ordered[i] = i;
        }

        for(int i=0;i<count;i++){
            for(int j=i+1;j<count;j++){
                if((scores[i] == scores[j] && ordered[i] > ordered[j])
                    || (asc == 0 && scores[i] < scores[j])
                    || (asc == 1 && scores[i] > scores[j])
                ){
                    scores[i]  = scores[i]+scores[j]-(scores[j]=scores[i]);
                    ordered[i]  = ordered[i]+ordered[j]-(ordered[j]=ordered[i]);
                }
            }
        }

        for(int i=0;i<count;i++){
            System.out.println(names[ordered[i]]+" "+scores[i]);
        }
    }
}

编辑于 2024-03-15 11:38:20 回复(0)
import java.util.*; 
import java.util.concurrent.atomic.AtomicInteger;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); 
        int n = scanner.nextInt(); // 读取人数  
        int order = scanner.nextInt(); // 读取排序方式,0代表从高到低,1代表从低到高   
        // 使用HashMap存储学生信息,确保相同成绩时,先录入的排在前面  
        List<Map<String, Object>> students = new ArrayList<>(); 
        for (int i = 0; i < n; i++) {  
            Map<String, Object> map = new HashMap<>();
            String name = scanner.next(); 
            int score = scanner.nextInt();
            map.put("score",score);
            map.put("name",name);
            students.add(map); 
    }   
    // 使用TreeMap根据成绩排序  
    Map<Integer, List<String>> sortedStudents = new TreeMap<Integer, List<String>>(order == 0 ? Comparator.reverseOrder() : Comparator.naturalOrder());
        for (Map<String, Object> student : students) {  
            sortedStudents.computeIfAbsent(Integer.parseInt(student.get("score").toString()),
                k -> new ArrayList<>()).add(student.get("name").toString()); 
        }   
        // 输出结果  
        for (Map.Entry<Integer, List<String>> entry : sortedStudents.entrySet()) {  
            int score = entry.getKey();
            List<String> names = entry.getValue(); 
            for (int i = 0; i < names.size(); i++) {  
                System.out.println(names.get(i) + " " + score); 
            }  }  scanner.close(); 
    }

编辑于 2024-02-03 12:30:42 回复(0)