题目描述
快排模板题
快排模拟网站:https://visualgo.net/zh/sorting
快排思想:通过参考点将数组左侧的全换成小于参考点的右侧的全换成大于参考点的,从而定死参考点位置;
1.(定参)找到参考点(随机 l,r,l+r>>1,该题需要l+r>>1 才能ac);
2.(光标查找)左右两个光标分别找小于参考点,大于参考点的数据,一旦找到就停下,当i和j没有相遇就互换i和j光标所对 应的数据;
3.(递归两侧)直到l>=r即这个范围只有这一个数据;
样例
5
3 1 2 4 5
C++ 代码
#include<iostream>
using namespace std;
int const maxn=1e5+10;
int q[maxn];
//快排模板
void quik_sort(int q[],int l,int r)
{
//递归终止条件
if(l>=r) return;
//1.定参 确定左光标,右光标,参考点
int i=l-1,j=r+1,x=q[(l+r)/2];
//2. 光标查找互换
while(i<j)
{
while(q[++i]<x);
while(q[--j]>x);
if(i<j) swap(q[i],q[j]);
}
//3.递归左右
quik_sort(q,l,j);
quik_sort(q,j+1,r);
}
//主函数的输入输出
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&q[i]);
quik_sort(q,0,n-1);
for(int i=0;i<n;i++) printf("%d ",q[i]);
}