快速排序是對冒泡排序的改進,採用分治法:
平均時間複雜度 O(n log n),最壞 O(n²)(已有序序列),空間複雜度 O(log n)(遞歸棧)。
設置兩個指針 i(左)和 j(右):
i=0, j=n-1,基準值 x = a[0]j--,找到第一個 a[j] < x,交換 a[i] 和 a[j]i++,找到第一個 a[i] > x,交換 a[i] 和 a[j]i == j,將基準值放入最終位置#include <stdio.h>
#include <stdlib.h>
void quickSort(int arr[], int left, int right) {
if (left >= right) return; // 遞歸終止條件
int pivot = arr[left]; // 基準值
int i = left, j = right;
while (i < j) {
// 從右向左找小於基準值的元素
while (i < j && arr[j] >= pivot) j--;
if (i < j) arr[i++] = arr[j]; // 移至左側,i右移
// 從左向右找大於基準值的元素
while (i < j && arr[i] <= pivot) i++;
if (i < j) arr[j--] = arr[i]; // 移至右側,j左移
}
arr[i] = pivot; // 基準值歸位
quickSort(arr, left, i - 1); // 遞歸排序左半部
quickSort(arr, i + 1, right); // 遞歸排序右半部
}
int main() {
int arr[] = {2, 4, 9, 3, 6};
int n = sizeof(arr) / sizeof(arr[0]);
quickSort(arr, 0, n - 1);
printf("排序結果:");
for (int i = 0; i < n; i++) printf("%d ", arr[i]);
printf("\n");
return 0;
}
i從左、j從右向中間收斂,減少比較次數i==j 即為基準值最終位置left >= right 時返回,處理空/單元素子數組O(n²)O(n log n)快速排序是面試、競賽、工程中最常用的內部排序算法。掌握其分區邏輯、遞歸結構、邊界條件是核心。實際工程中推薦使用標準庫qsort(C)或std::sort(C++),它們綜合了快速排序、堆排序、插入排序優點(Introsort),性能穩健可靠。