public class QuickSort {
/** 返回基準值最終位置 */
public int partition(int[] a, int lo, int hi) {
int pivot = a[hi]; // 選最右元素為基準
int i = lo - 1; // i 指向「≤基準區」尾部
for (int j = lo; j < hi; j++) {
if (a[j] <= pivot) { // 發現小元素
i++;
swap(a, i, j); // 換到「≤區」末尾
}
}
swap(a, i + 1, hi); // 基準值歸位
return i + 1;
}
public void sort(int[] a, int lo, int hi) {
if (lo < hi) {
int p = partition(a, lo, hi);
sort(a, lo, p - 1);
sort(a, p + 1, hi);
}
}
private void swap(int[] a, int i, int j) {
int t = a[i]; a[i] = a[j]; a[j] = t;
}
public static void main(String[] args) {
int[] arr = {4, 1, 5, 3, 7, 12, 65, 7};
new QuickSort().sort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr)); // [1, 3, 4, 5, 7, 7, 12, 65]
}
}
循環過程中始終保持:
a[lo..i] ≤ pivota[i+1..j-1] > pivota[j..hi-1] 待檢查a[hi] = pivot| 指標 | 數值 |
|---|---|
| 平均時間 | O(n log n) |
| 最壞時間 | O(n²) — 有序數組選端點為基準 |
| 空間 | O(log n) 遞歸棧 |
| 穩定性 | 不穩定 |
mid = median(lo, (lo+hi)/2, hi) 選基準,極大降低最壞情況概率;Arrays.sort(int[]) → 雙軸快速排序;Collections.sort(List) → TimSort (歸併+插入混合)。手寫快排是理解「原地分區、不變量維護、遞歸邊界」的必修課,面試與造輪子雙通吃。