快速排序
让左指针从左往右移动,右指针从右往左移动,直到两个指针都移动到边界。
每一轮快速排序中
i
>
j
i > j
i>j 时排序终止,因为此时已经确保了 flag 左侧的元素一定小于等于 flag,右侧的元素一定大于等于 flag,分别对两侧区间再次快排即可。
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 1e5+3;
int a[maxn];
void qsort(int l,int r)
{
int i=l,j=r;
int flag=a[(l+r)>>1];
do
{
while(a[i]<flag) i++; //不能取等号
while(a[j]>flag) j--;
if(i<=j) swap(a[i],a[j]),i++,j--;
}while(i<=j);
if(i<r) qsort(i,r);
if(l<j) qsort(l,j);
return ;
}
void solve()
{
int n; cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
qsort(1,n);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return ;
}
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int T; T=1;
while(T--) solve();
return 0;
}