快速排序
快速排序是一种常用的排序算法,它采用分治策略。该算法的基本思想是选择一个元素作为枢纽,然后将数组分割成两个子数组,一个子数组中的元素都小于枢纽,另一个子数组中的元素都大于枢纽。然后对这两个子数组进行递归排序,最后将它们合并起来。快速排序的平均时间复杂度为O(nlogn),空间复杂度为O(logn)。它的优点是速度快且空间复杂度低,但缺点是在最坏情况下可能会退化为O(n^2) 的时间复杂度。
步骤
序列已存入 q[]
1)确定pivot,正常情况下取第一个数,本文代码中取中位数, pivot = q[l + r >> 1] (位运算,取中位数)。
2)先移动指针,再比较大小。分别定义 i 指针指向序列头, j 指针指向序列尾,i向后移动, j向前移动,直到 q[i] 比 pivot 大,停下, 同理,q[j] 比 pivot 小,停下。
3)交换 i 和 j 指针的值
4) 递归 j 划分的左右区间 (详细查看[ AcWing 785. 快速排序算法的证明与边界分析 - AcWing])
代码如下:
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N];
int n;
void quick_sort(int q[], int l, int r) {
if (l >= r) return;
int x = q[l + r >> 1], i = l - 1, j = r + 1;
while (i < j) {
do ++i; while (q[i] < x);
do --j; while (q[j] > x);
if (i < j) swap(q[i], q[j]);
}
quick_sort(q, l, j);
quick_sort(q, j + 1, r);
}
int main() {
cin >> n;
for (int i = 0; i < n; i ++) cin >> q[i];
quick_sort(q, 0, n - 1);
for (int i = 0; i < n; i ++) cout << q[i] << " ";
return 0;
}