快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。
快速排序动画
快速排序图片
排序方法 如图所示
先把数字现象成一堆卡片
1. 选一张“基准”卡片:首先,你从这堆卡片中随机挑出一张,这张卡片就是你的“基准”。
2. 分开两堆:然后,把剩下的卡片分成两堆——一堆比“基准”小,另一堆比“基准”大。这样做完后,“基准”卡片实际上就已经放到了正确的位置上,因为所有比它小的都在左边,所有比它大的都在右边。
3. 重复上面的过程:接着,对左边那堆小卡片和右边那堆大卡片重复这个过程。也就是说,对每堆卡片都选一个新的“基准”,然后再次分开它们,直到每一堆都只有一张卡片或者没有卡片为止。
时间复杂度:
最好和平均情况:快速排序的平均时间复杂度是O(n log n),其中n是数组中的元素数量。这是因为每次分区都能将问题规模减半。
最坏情况:如果每次选的“基准”都是数组中的最小或最大值,那么时间复杂度会退化到O(n^2)。
C++代码示例
#include <iostream>
using namespace std;
// 快速排序的分区函数
int partition(int arr[], int low, int high) {
int pivot = arr[high]; // 选择最后一个元素作为枢轴
int i = (low - 1); // 最小元素索引
for (int j = low; j <= high - 1; j++) {
// 如果当前元素小于或等于枢轴
if (arr[j] <= pivot) {
i++; // 增加小于枢轴元素的索引
swap(arr[i], arr[j]);
}
}
swap(arr[i + 1], arr[high]);
return (i + 1);
}
// 快速排序函数
void quickSort(int arr[], int low, int high) {
if (low < high) {
// pi是分区索引,arr[pi]现在位于正确的位置
int pi = partition(arr, low, high);
// 单独对分区元素左边和右边的子数组进行排序
quickSort(arr, low, pi - 1);
quickSort(arr, pi + 1, high);
}
}
int main() {
int arr[] = {10, 7, 8, 9, 1, 5, 3, 6, 4, 2};
int n = sizeof(arr)/sizeof(arr[0]);
quickSort(arr, 0, n-1);
cout << "Sorted array: \n";
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
return 0;
}