AcWing 785. 快速排序
原题链接
简单
作者:
世界天光
,
2024-11-17 21:23:54
,
所有人可见
,
阅读 2
#include<iostream>
using namespace std;
const int N = 1e6 + 10;//一般为了防止边界问题,边界处理可能需要多一位,所以保险起见多开一些
int n;
int q[N];
//快速排序模板
void quick_sort(int q[], int l, int r) //三个参量左端位置,右端位置,数组
{
if (l >= r)return;//左端位置大于右端则无需排序
int i = l - 1;
int j = r + 1;
swap(q[l], q[l+r>>1]);
int x = q[l]; //只取边界值过不掉acwing中的快速排序题,因为如果排序是顺序的话,取边界形式时间复杂度会退化成O(N^2)
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);//递归处理左右两段
//这里注意如果分界值取左边界,那么最好用上述递归方法
//同样如果分界值取的是右边界,那么最好将j换成i-1。
//但分界值如果取中间值都可以。上述两种原因是会导致边界问题例如第一个排序1,2。下面选用i,这样会出现死循环。
//分界值取中间值也可能出现边界问题,如果报错要具体分析
}
int main()
{
scanf_s("%d", &n);//算法中使用scanf比cin输入速度快
for (int i = 0; i < n; i++) scanf_s("%d", &q[i]);
quick_sort(q, 0, n-1);//快速排序
for (int i = 0; i < n; i++) printf("%d ", q[i]);
return 0;
}