1. 基本思想
总是以第一个元素为基准,目标是找到基准的位置,使得右边都大于基准,左边都小于基准,然后再递归左右的子表,从而找到所有元素的位置,完成排序。
2. 代码案例实现
#include<iostream>
using namespace std;
//寻找用第一个元素的位置,右边大于它,左边小于它
int partition(int a[], int low, int high) {
int pivot = a[low]; //第一个元素作为基准(枢轴)
while (low < high) {
while (low < high && a[high] >= pivot) {
high--;
}
a[low] = a[high]; //大于基准pivot的放在low的位置
while (low < high && a[low] <= pivot) {
low++;
}
a[high] = a[low]; //小于基准pivot的放在high的位置
}
a[low] = pivot; //此时low=high
return low;
}
//快速排序
void quickSort(int a[], int low, int high) {
if (low < high) { //验证合法性
int pivotpos = partition(a, low, high); //求出该放置的位置
quickSort(a, low, pivotpos - 1); //递归由pivotpos隔开的左子表
quickSort(a, pivotpos + 1, high); //递归由pivotpos隔开的右子表
}
}
int main() {
int a[10] = { 5,4,6,2,10,1,3,8,7,9 };
quickSort(a, 0, 9);
for (int i = 0; i < 10; i++)
{
cout << a[i] << " ";
}
cout << endl;
return 0;
}
3. 运行结果
4. 时间复杂度
最好情况:O(nlogn)
最坏情况:O(n^2)
平均:O(nlogn)
5. 空间复杂度
由于要使用递归函数栈
O(logn)
6. 稳定性
不稳定