排序算法是計算機科學基石。本文提供三種基礎排序的 Java 實現,並分析時間複雜度與優化思路。
將無序區元素逐個插入有序區適當位置。
public static int[] insertSort(int[] arr) {
for (int i = 1; i < arr.length; i++) {
int key = arr[i];
int j = i - 1;
// 將大於 key 的元素右移
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
特點:近乎有序數據表現優異(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[j] < arr[minIdx]) minIdx = j;
}
// 交換
int tmp = arr[i];
arr[i] = arr[minIdx];
arr[minIdx] = tmp;
}
return arr;
}
特點:交換次數最少(O(n)),但比較次數固定 O(n²),不穩定。
public static int[] bubbleSort(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
}
return arr;
}
public static int[] bubbleSortOptimized(int[] arr) {
boolean swapped;
for (int i = 0; i < arr.length - 1; i++) {
swapped = false;
for (int j = arr.length - 1; j > i; j--) {
if (arr[j] < arr[j - 1]) {
int tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
swapped = true;
}
}
if (!swapped) break; // 本輪無交換,說明已有序
}
return arr;
}
特點:優化後最好情況 O(n),原地排序,穩定。
| 算法 | 最好 | 平均 | 最壞 | 空間 | 穩定性 |
|---|---|---|---|---|---|
| 插入排序 | 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()(雙軸快排/TimSort)