本文目录导读:

- 第一步:定义数据模型(基础)
- 第二步:手动实现核心排序算法(深入理解逻辑)
- 第三步:使用 Java 内置排序(工程实践)
- 第四步:进阶理解——快速排序与归并排序(面试重点)
- 学习案例:完整的管理系统演示
- 核心学习要点总结
这是一个非常典型的Java学习场景,通过一个学生成绩管理系统来学习排序算法,不仅能理解算法本身的逻辑,还能看到它们在实际业务中的应用。
下面我为你设计一个循序渐进的学习路径,包含核心代码示例。
第一步:定义数据模型(基础)
你需要一个学生类来承载数据,这是所有排序操作的前提。
// Student.java
public class Student {
private int id;
private String name;
private double score; // 成绩,这是排序的关键字段
// 构造器、Getter/Setter
public Student(int id, String name, double score) {
this.id = id;
this.name = name;
this.score = score;
}
public double getScore() { return score; }
public String getName() { return name; }
public int getId() { return id; }
@Override
public String toString() {
return String.format("ID:%d, Name:%s, Score:%.1f", id, name, score);
}
}
第二步:手动实现核心排序算法(深入理解逻辑)
这是最关键的一步。不要一开始就用 Collections.sort(),你需要手动写一遍,才能理解它们的工作原理。
假设我们有一个学生列表 List<Student> studentList,我们要按成绩从高到低(降序)排序。
冒泡排序(Bubble Sort)—— 直观但较慢
- 场景:适合数据量极小(几十个学生)或基本有序的列表。
- 核心思想:相邻元素两两比较,将值较小的元素(降序排序)慢慢“浮”到末尾。
public static void bubbleSort(List<Student> list) {
int n = list.size();
for (int i = 0; i < n - 1; i++) {
boolean swapped = false; // 优化:如果没有交换,说明已经有序
for (int j = 0; j < n - 1 - i; j++) {
// 降序:如果前一个成绩 < 后一个成绩,则交换(大的往前移)
if (list.get(j).getScore() < list.get(j + 1).getScore()) {
Student temp = list.get(j);
list.set(j, list.get(j + 1));
list.set(j + 1, temp);
swapped = true;
}
}
if (!swapped) break; // 提前结束
}
}
选择排序(Selection Sort)—— 简单直接
- 场景:理解“每次选最值”的概念。
- 核心思想:每一轮在未排序部分找到最大值,放到已排序部分的末尾。
public static void selectionSort(List<Student> list) {
int n = list.size();
for (int i = 0; i < n - 1; i++) {
int maxIdx = i; // 假设当前位置是最大值的索引
for (int j = i + 1; j < n; j++) {
// 找到成绩更高的学生的索引
if (list.get(j).getScore() > list.get(maxIdx).getScore()) {
maxIdx = j;
}
}
// 将最大值(成绩最高)交换到位置 i
if (maxIdx != i) {
Student temp = list.get(i);
list.set(i, list.get(maxIdx));
list.set(maxIdx, temp);
}
}
}
插入排序(Insertion Sort)—— 类似整理扑克牌
- 场景:数据基本有序,或者需要在线(动态添加数据)排序时。
- 核心思想:将未排序的元素插入到已排序序列的正确位置。
public static void insertionSort(List<Student> list) {
int n = list.size();
for (int i = 1; i < n; i++) {
Student key = list.get(i); // 当前要插入的学生
double keyScore = key.getScore();
int j = i - 1;
// 已排序部分中,将成绩比 key 低的往后移(为了给 key 腾出位置)
while (j >= 0 && list.get(j).getScore() < keyScore) {
list.set(j + 1, list.get(j));
j--;
}
list.set(j + 1, key); // 插入 key
}
}
第三步:使用 Java 内置排序(工程实践)
在你理解了手动算法后,实际项目中会用内置工具类,但你要能理解它的原理。
使用 Collections.sort() + Comparator(最常用)
要求 Student 类不需要实现任何接口,通过Comparator指定排序规则。
// 按成绩降序排列
Collections.sort(studentList, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
// 降序:s1分数 < s2分数,返回正数,交换
return Double.compare(s2.getScore(), s1.getScore());
// 升序:return Double.compare(s1.getScore(), s2.getScore());
}
});
使用 Lambda 表达式(Java 8+ 简洁写法)
// 按成绩降序 studentList.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore())); // 或使用方法引用(升序) studentList.sort(Comparator.comparingDouble(Student::getScore));
注意: Collections.sort() 底层使用的是 归并排序(TimSort),它结合了归并排序和插入排序的优点,是稳定的,且时间复杂度为 O(n log n)。
第四步:进阶理解——快速排序与归并排序(面试重点)
对于有一定基础的学习者,可以尝试实现更高效的算法。
快速排序(Quick Sort)
- 场景:性能要求高,但不稳定。
- 核心:选一个“基准值”(pivot),比它大的放左边,小的放右边,然后递归。
归并排序(Merge Sort)
- 场景:需要稳定排序,或者处理链表排序时。
- 核心:分治思想,先分割成最小单元,再两两合并。
学习案例:完整的管理系统演示
创建一个简单的控制台程序,展示不同排序的效果。
import java.util.*;
public class StudentManagementSystem {
private List<Student> students = new ArrayList<>();
public void addStudent(int id, String name, double score) {
students.add(new Student(id, name, score));
}
// 展示排序菜单
public void showSortedByScore(String algorithm) {
List<Student> tempList = new ArrayList<>(students); // 复制一份,不破坏原数据
switch (algorithm) {
case "bubble":
bubbleSort(tempList);
break;
case "selection":
selectionSort(tempList);
break;
case "insertion":
insertionSort(tempList);
break;
case "builtin":
tempList.sort((s1, s2) -> Double.compare(s2.getScore(), s1.getScore()));
break;
default:
System.out.println("Unknown algorithm");
return;
}
System.out.println("Sorted by " + algorithm + " (Descending):");
tempList.forEach(System.out::println);
}
// 将上面实现的三种排序方法复制到这里...
public static void main(String[] args) {
StudentManagementSystem sms = new StudentManagementSystem();
sms.addStudent(1, "Alice", 88.5);
sms.addStudent(2, "Bob", 92.0);
sms.addStudent(3, "Charlie", 75.0);
sms.addStudent(4, "David", 95.5);
sms.addStudent(5, "Eve", 82.0);
// 展示不同排序结果
sms.showSortedByScore("bubble");
sms.showSortedByScore("insertion");
sms.showSortedByScore("builtin");
}
}
核心学习要点总结
- 对比复杂度:冒泡、选择、插入是 O(n²);快速、归并、内置排序是 O(n log n),用不同数据量(100,1000,10000)测试性能差异。
- 理解稳定性:冒泡和插入是稳定的(相同分数的学生,排序后相对顺序不变);选择排序不稳定,这在学生管理系统中有实际意义(先按名字,再按分数)。
- 理解 Comparator:重点掌握
compare(s1, s2)返回负整数、零、正整数代表的次序关系。 - 实战建议:在写代码时,多使用
System.out.println打印出每一轮排序后的列表,观察数据是如何一步步变成有序的,这是理解算法最直观的方式。
通过这个案例,你不仅能学会排序语法,更能深入理解不同算法在业务逻辑中的应用场景和取舍。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播