排序是基礎演算法必修課。本文提供冒泡排序 (教學用)與Comparable 介面實作物件排序 (實務標準)兩套完整代碼。
int[] a = {10,15,19,11,14,16,21,23,16,18,19};
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - i - 1; j++) {
if (a[j] < a[j+1]) { // 降序:前小於後則交換
int tmp = a[j]; a[j] = a[j+1]; a[j+1] = tmp;
}
}
}
// 輸出: 23 21 19 19 18 16 16 15 14 11 10
⚠️ **教學演示用**,實務 **嚴禁** 用冒泡,**請用 Arrays.sort() / Collections.sort() (TimSort, O(n log n))**。
class Person implements Comparable {
private String name;
private int age;
// getter/setter/建構子 省略
@Override
public int compareTo(Person o) {
return Integer.compare(this.age, o.age); // 年齡升序
// 多欄位: return Comparator.comparing(Person::getAge).thenComparing(Person::getName).compare(this, o); // Java 8+
}
}
// 使用
List list = Arrays.asList(new Person("A",30), new Person("B",20), new Person("C",25));
Collections.sort(list); // 或 list.sort(null);
// 結果: B(20), C(25), A(30)
// 年齡降序
list.sort(Comparator.comparing(Person::getAge).reversed());
// 名稱升序
list.sort(Comparator.comparing(Person::getName));
// 空值安全
list.sort(Comparator.nullsLast(Comparator.comparing(Person::getAge)));
| 場景 | 推薦做法 | 複雜度 |
|---|---|---|
| 基本型別陣列 | Arrays.sort(arr) | O(n log n) TimSort |
| List<基本型別/包裝型別> | Collections.sort(list) / list.sort(null) | O(n log n) |
| List<自訂物件> 自然順序 | 實作 Comparable + Collections.sort() | O(n log n) |
| List<自訂物件> 多種順序 | list.sort(Comparator...) (Java 8+) | O(n log n) |
| 平行排序 (大數據) | Arrays.parallelSort(arr) (Java 8+) | 多核並行 |