题解 | #成绩排序#Java归并稳定排序,内部类存数据
成绩排序
https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
为啥排序题这么多人用sort啊?个人感觉这类题考的就是对排序算法的掌握。比如这个题一个考点就是哪些排序是稳定排序(冒泡、插入、归并、计数)。冒泡插入就是基本的O(n^2),归并就是进阶的O(nlogn)。然后数据用内部类存储(用二维数组也可),然后在类里面写一个比较器用来应对正序逆序排序。
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int count=in.nextInt();
int order=in.nextInt();
ArrayList<Student> rank=new ArrayList<>();
Main main=new Main();
for(int i=0; i<count; i++){
String name=in.next();
Integer grade=in.nextInt();
rank.add(main.new Student(name,grade));
}
if(rank.size()>1){
main.mergeSort(rank,0,count-1,order);
}
for(Main.Student student: rank){
System.out.println(student.name+" "+student.grade);
}
}
void mergeSort(ArrayList<Student> seq, int left, int right, int order){
if(left>=right){
return;
}
int mid=(left+right)>>1;
mergeSort(seq,left,mid,order);
mergeSort(seq,mid+1,right,order);
merge(seq,left,mid,right,order);
}
void merge(ArrayList<Student> seq, int left, int mid, int right, int order){
ArrayList<Student> copy=new ArrayList<>(right-left+1);
int i=left;
int j=mid+1;
while(i<=mid&&j<=right){
if(seq.get(i).compareTo(seq.get(j),order))
copy.add(seq.get(i++));
else
copy.add(seq.get(j++));
}
while(i<=mid){
copy.add(seq.get(i++));
}
while(j<=right){
copy.add(seq.get(j++));
}
for(Student student: copy){
seq.set(left++,student);
}
}
class Student{
String name;
Integer grade;
Student(String name, Integer grade){
this.name=name;
this.grade=grade;
}
boolean compareTo(Student def, int order){
if(order==1) return grade<=def.grade;
return grade>=def.grade;
}
}
}
查看1道真题和解析