快速排序是對冒泡排序的改進,由 C.A.R. Hoare 於 1962 年提出。它同樣採用分治策略,平均時間複雜度為 O(n log n),是實際應用中最快的通用排序算法之一。
以序列 [32, 12, 7, 78, 23, 45] 為例,基準值 key=32:
low=0, high=5,從右向左掃描找 <32 的元素:45→23(找到)low 位置,low++ → [23, 12, 7, 78, 23, 45]>32 的元素:12→7→78(找到)high 位置,high-- → [23, 12, 7, 78, 23, 78]low >= high,最後將 key 放入 low 位置[23, 12, 7, 32, 78, 45],基準值 32 位置確定#include <stdio.h>
#include <stdlib.h>
#define N 6
int partition(int arr[], int low, int high) {
int key = arr[low]; // 基準值
while (low < high) {
// 從右向左找小於 key 的元素
while (low < high && arr[high] >= key) high--;
if (low < high) arr[low++] = arr[high];
// 從左向右找大於 key 的元素
while (low < high && arr[low] <= key) low++;
if (low < high) arr[high--] = arr[low];
}
arr[low] = key; // 基準值歸位
return low;
}
void quickSort(int arr[], int start, int end) {
if (start < end) {
int pos = partition(arr, start, end);
quickSort(arr, start, pos - 1);
quickSort(arr, pos + 1, end);
}
}
int main() {
int arr[N] = {32, 12, 7, 78, 23, 45};
printf("排序前:\n");
for (int i = 0; i < N; i++) printf("%d\t", arr[i]);
quickSort(arr, 0, N - 1);
printf("\n排序後:\n");
for (int i = 0; i < N; i++) printf("%d\t", arr[i]);
printf("\n");
return 0;
}
排序前:32 12 7 78 23 45 排序後:7 12 23 32 45 78
| 特性 | 說明 |
|---|---|
| 平均時間複雜度 | O(n log n) |
| 最壞時間複雜度 | O(n²)(已有序序列,可用隨機基準值優化) |
| 空間複雜度 | O(log n)(遞歸棧) |
| 穩定性 | 不穩定 |
| 原地排序 | 是,僅需常數額外空間 |
快速排序適用於:大數據量、內存敏感、不要求穩定性的通用排序場景。C++ STL 的 std::sort、Java 的 Arrays.sort(基本類型)底層多基於快速排序變體實現。