掌握基礎排序算法是程序員內功心法。本文提供 Java 實現的四種經典排序:快速排序(Arrays.sort)、冒泡排序、選擇排序、插入排序,附完整代碼、複雜度分析與工程選型建議。
Arrays.sort()import java.util.Arrays;
public class QuickSortDemo {
public static void main(String[] args) {
int[] arr = {5, 4, 2, 4, 9, 1};
Arrays.sort(arr); // 雙軸快排 (Java 7+) / TimSort (對象數組)
System.out.println(Arrays.toString(arr)); // [1, 2, 4, 4, 5, 9]
}
}
特點:JDK 內部高度優化(基本類型雙軸快排,對象類型 TimSort),平均 O(n log n),穩定(對象版),生產環境直接用,勿造輪子。
public static int[] bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
}
}
return arr;
}
複雜度:比較 O(n²),交換 O(n²)。
優化:加入 boolean swapped 標記,單輪無交換則提前結束(最好情況 O(n))。
public static int[] selectSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
int minIdx = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIdx] > arr[j]) minIdx = j;
}
if (minIdx != i) {
int tmp = arr[i]; arr[i] = arr[minIdx]; arr[minIdx] = tmp;
}
}
return arr;
}
複雜度:比較 O(n²),交換 O(n)(每輪最多一次交換)。
場景:交換操作極其昂貴(如大對象移動)時優於冒泡。
public static int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
for (int j = i; j > 0 && arr[j] < arr[j-1]; j--) {
int tmp = arr[j-1]; arr[j-1] = arr[j]; arr[j] = tmp;
}
}
return arr;
}
複雜度:比較 O(n²),移動/複製 O(n²)(最好情況已有序 O(n))。
優勢:穩定排序、原地排序、適應性強(數據基本有序時極快),JDK Arrays.sort 小數組閾值(<47)會切換到插入排序。
| 算法 | 平均時間 | 最好情況 | 最壞情況 | 空間 | 穩定性 | 工程建議 |
|---|---|---|---|---|---|---|
| 快速排序 | O(n log n) | O(n log n) | O(n²) | O(log n) | 不穩定 | 首選,直接用 Arrays.sort |
| 冒泡排序 | O(n²) | O(n) | O(n²) | O(1) | 穩定 | 教學/極小數據 |
| 選擇排序 | O(n²) | O(n²) | O(n²) | O(1) | 不穩定 | 交換昂貴場景 |
| 插入排序 | O(n²) | O(n) | O(n²) | O(1) | 穩定 | 小數組/近乎有序/混合排序基礎 |
Arrays.sort() / Collections.sort() / List.sort() —— 無腦用,JDK 已幫你做好所有優化。Arrays.parallelSort() 利用多核,大數組顯著加速。面試必會手寫冒泡/選擇/插入/快排分區;工作中請擁抱
Arrays.sort。理解算法本質,是為了在關鍵時刻做出正確工程決策,而非重複造輪子。