描述
给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
例示:
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代表从低到高
数据范围:人数: 1≤n≤200
进阶:时间复杂度:O(nlogn) ,空间复杂度:O(n)
输入描述:
第一行输入要排序的人的个数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
解法
主要采用冒泡排序。
由高到低排
- 当前元素current跟前面元素before比较
- 如果current > before,则两者交换位置,
- 否则保持不要动,因为考虑了按先录入排列在前的规则。
由低到高排
- 当前元素current跟前面元素next比较
- 如果current > next,则两者交换位置,
- 否则保持不要动,因为考虑了按先录入排列在前的规则。
/** * Welcome to https://waylau.com */ package com.waylau.nowcoder.exam.oj.huawei; import java.io.IOException; import java.util.Scanner; /** * HJ68 成绩排序. * 描述:给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列, * 相同成绩都按先录入排列在前的规则处理。 * 例示: * 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代表从低到高 * 数据范围:人数: 1≤n≤200 * 进阶:时间复杂度:O(nlogn)\O(nlogn) ,空间复杂度:O(n)\O(n) * * 输入描述: * 第一行输入要排序的人的个数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 * * @since 1.0.0 2022年8月27日 * @author <a href="https://waylau.com">Way Lau</a> */ public class HJ068ScoreSort { public static void main(String[] args) throws IOException { // 输入 Scanner in = new Scanner(System.in); int n = in.nextInt(); // 排序方式,0代表从高到低,1代表从低到高 int sortType = in.nextInt(); // 学生列表 Student[] students = new Student[n]; for (int i = 0; i < n; i++) { Student stu = new Student(in.next(), in.nextInt()); students[i] = stu; } // 排序 sort(students, sortType); // 输出 for (int i = 0; i < students.length; i++) { System.out.println(students[i].name + " " + students[i].score); } // 关闭 in.close(); } // 冒泡排序 // 考虑“按先录入排列在前” private static Student[] sort(Student[] students, int sortType) { // 由高到低排 if (sortType == 0) { for (int i = 0; i < students.length - 1; i++) { for (int j = students.length - 1; j - i > 0; j--) { // 当前元素current跟前面元素before比较 // 如果current > before,则两者交换位置, // 否则保持不要动,因为考虑了按先录入排列在前的规则。 Student current = students[j]; Student before = students[j - 1]; if (current.score > before.score) { students[j] = before; students[j - 1] = current; } } } } // 由低到高排 if (sortType == 1) { for (int i = 0; i < students.length - 1; i++) { for (int j = 0; j < students.length - 1 - i; j++) { // 当前元素current跟前面元素next比较 // 如果current > next,则两者交换位置, // 否则保持不要动,因为考虑了按先录入排列在前的规则。 Student current = students[j]; Student next = students[j + 1]; if (current.score > next.score) { students[j] = next; students[j + 1] = current; } } } } return students; } } class Student { public String name; public int score; public Student(String name, int score) { this.name = name; this.score = score; } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html