快速排序採用分治法:從序列挑選基準值,將小於基準者置左、大於者置右(分區操作),基準最終位於正確位置;遞迴對左右子序列排序,直到長度 0 或 1。關鍵在於分區演算法的實現。
res = arr[low]high 向左找第一個 < res 的元素,交換到 lowlow 向右找第一個 > res 的元素,交換到 highlow == high,返回基準最終位置#include <stdlib.h>
void swap(int arr[], int i, int j) {
int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
}
// 分區:返回基準最終位置
int getPivot(int arr[], int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) high--;
swap(arr, low, high);
while (low < high && arr[low] <= pivot) low++;
swap(arr, low, high);
}
return low;
}
void QSort(int arr[], int low, int high) {
if (low < high) {
int pivotIdx = getPivot(arr, low, high);
QSort(arr, low, pivotIdx - 1);
QSort(arr, pivotIdx + 1, high);
}
}
void Quick_Sort(int arr[], int low, int high) {
QSort(arr, low, high - 1);
}
int main() {
int arr[10];
for (int i = 0; i < 10; i++) arr[i] = rand() % 33;
printf("Before sort:\n");
for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
Quick_Sort(arr, 0, 10);
printf("\nAfter sort:\n");
for (int i = 0; i < 10; i++) printf("%d ", arr[i]);
system("pause");
return 0;
}
Before sort: 8 20 31 1 29 16 27 21 1 11 After sort: 1 1 8 11 16 20 21 27 29 31
| 指標 | 數值 |
|---|---|
| 平均時間複雜度 | O(n log n) |
| 最壞時間複雜度 | O(n²)(已排序序列+固定基準) |
| 空間複雜度 | O(log n) 遞迴堆疊 |
| 穩定性 | 不穩定 |
常見優化: