7快速排序
5
void QuickSort(ll A[],ll p,ll r)
{
if(p<r)
{
ll q=Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
以A[r]为分界线,将小于这个数的数全部扔到数组最前端,然后把这个数插入中间当分界线。处理完后的数组就是前i个是比A[i]小的数,后面的数都比A[i]大,A[i]是分界线。返回的是A[i]的下标i
ll Partition(ll A[],ll p,ll r)
{
x=A[r];
i=p-1;
for(j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
完整程序
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef pair<long long,long long> pll;
const int inf = 0x3f3f3f3f;
const int maxn=100010;
ll A[maxn];
ll Partition(ll A[],ll p,ll r)
{
ll x=A[r];
ll i=p-1;
for(ll j=p;j<=r-1;j++)
{
if(A[j]<=x)
{
i++;
swap(A[i],A[j]);
}
}
swap(A[i+1],A[r]);
return i+1;
}
void QuickSort(ll A[],ll p,ll r)
{
if(p<r)
{
ll q=Partition(A,p,r);
QuickSort(A,p,q-1);
QuickSort(A,q+1,r);
}
}
int main()
{
ll n;
scanf("%lld",&n);
for(ll i=1;i<=n;i++)
cin>>A[i];
QuickSort(A,1,n);
for(ll i=1;i<=n;i++)
cout<<A[i]<<' ';
return 0;
}