雙向冒泡排序(Cocktail Shaker Sort)在每一輪中:
相比單向冒泡,雙向版本每輪確定兩端元素,減少約一半的外層循環次數。
public class BiBubbleSort {
public int[] sort(int[] a) {
int left = 0;
int right = a.length - 1;
while (left < right) {
boolean swapped = false;
// 正向:最大值移到 right
for (int i = left; i < right; i++) {
if (a[i] > a[i + 1]) {
swap(a, i, i + 1);
swapped = true;
}
}
right--;
if (!swapped) break;
swapped = false;
// 反向:最小值移到 left
for (int i = right; i > left; i--) {
if (a[i] < a[i - 1]) {
swap(a, i, i - 1);
swapped = true;
}
}
left++;
if (!swapped) break;
}
return a;
}
private void swap(int[] a, int i, int j) {
int t = a[i]; a[i] = a[j]; a[j] = t;
}
}
swapped 標誌:若某方向無交換,說明已有序,提前終止。left/right 逐步收縮,避免重複比較已排序區域。| 指標 | 複雜度 |
|---|---|
| 時間複雜度(最好) | O(n) — 已有序數組 |
| 時間複雜度(平均/最壞) | O(n²) |
| 空間複雜度 | O(1) — 原地排序 |
| 穩定性 | 穩定 |