题目描述
给定你一个长度为n的整数数列。
请你使用快速排序对这个数列按照从小到大进行排序。
并将排好序的数列按顺序输出。
快速排序
因为数据范围是$10^5$, 所以只能用$O(nlogn)$的算法
时间复杂度
$O(nlogn)$
思路
取数组的中点, 用双指针分别从头和尾扫描, 比较与中点值的大小,最终的目标是使数组升序排列, 如果碰到中点左边的数大于中点的数值, 右边的数小于中点的数值, 便形成了逆序, 交换这两个数, 在扫描到中点后, 数组左边的数比数组右边的数小, 然后递归的对两个子序列进行快速排序.
如果 $i$ 和 $j$ 是用 do_while 进行扫描的话, 起点要从 $l - 1$ 和 $r + 1$ 开始.
C++ 代码
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int q[N];
void qsort(int *q, int l, int r) {
if (l >= r) return;
int i = l - 1, j = r + 1, x = q[l + 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]);
}
qsort(q, l, j), qsort(q, j + 1, r);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]);
qsort(q, 0, n - 1);
for (int i = 0; i < n; i ++ ) printf("%d ", q[i]);
return 0;
}