ACWING基础算法模板题:785快速排序

类似:786. 第k个数

quick_sort(q, l, j);

//j 可以替换成 i-1,但是相应的x 不能取l会有边界问题,要取r,或者别的(l+r)/2啥的。

quick_sort(q, j+1, r);

//j+1可以替换成 i

#include<iostream>
#include<cstdio>
#define rep(x ,a, b) for(int x =a; x<=b; x++)

using namespace std;
const int N = 1e5 + 10;

int q[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; //x = q[l]会被数据针对,有可能出现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);//如果取j, 要注意x内不能取r,容易产生边界问题
	 quick_sort(q, j+1, r);//取i ,同理不取l;
}
int main()
{
    int n;
	scanf("%d", &n);
	rep(i, 1, n) scanf("%d", &q[i]);
	quick_sort(q, 1, n);
	rep(i, 1, n) printf("%d ", q[i]);
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/m0_54674275/article/details/121344375