题解 | #成绩排序# 手搓归并 + 使用库
成绩排序
https://www.nowcoder.com/practice/8e400fd9905747e4acc2aeed7240978b
看到需要稳定的排序 + logN,立刻想到归并,但是默认的 Arrays.sort() 使用的是快排,并不稳定,我于是手搓了一个:
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Main { // 稳定并且时间复杂度为 logN 的算法是归并 public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int order = in.nextInt(); List<Student> list = new ArrayList<>(n); for (int i = 0; i < n; i++) { String name = in.next(); int score = in.nextInt(); Student student = new Student(name, score); list.add(student); } List<Student> ans = sort(list, order); ans.forEach(System.out::println); } } public static List<Student> sort(List<Student> list, int order) { int n = list.size(); if (n <= 1) return list; List<Student> list1 = list.subList(0, n / 2); List<Student> list2 = list.subList(n / 2, n); list1 = sort(list1, order); list2 = sort(list2, order); List<Student> ans = new ArrayList<>(n); int i, j; i = j = 0; while (i < list1.size() || j < list2.size()) { if (j == list2.size() || ( i < list1.size() && (order == 0 ? list1.get(i).score >= list2.get(j).score : list1.get( i).score <= list2.get(j).score) )) { ans.add(list1.get(i)); i++; } else { ans.add(list2.get(j)); j++; } } return ans; } public static class Student { String name; int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public String toString() { return name + " " + score; } } }
后来翻看资料,发现 Collections.sort() 使用的就是归并排序 o.O
import java.util.*; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) { int n = in.nextInt(); int order = in.nextInt(); List<Student> list = new ArrayList<>(n); for (int i = 0; i < n; i++) { String name = in.next(); int score = in.nextInt(); Student student = new Student(name, score); list.add(student); } if (order == 0) list.sort((a, b) -> b.score - a.score); else list.sort((a, b) -> a.score - b.score); list.forEach(System.out::println); } } public static class Student { String name; int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public String toString() { return name + " " + score; } } }