归并排序:复杂度nlogn
快排:复杂度一般情况下nlogn 最坏情况下 n*n
归并排序:
//可以用于求解逆序数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
const int N = 5e5+5;
int a[N],b[N];
int ans=0;
void merge(int l,int mid,int r)
{
int i,j,k;
k=l;i=l;j=mid+1;
while(i<=mid&&j<=r)
{
if(a[i]>a[j])
{
b[k++]=a[j++];
ans+=mid-i+1;
}
else
{
b[k++]=a[i++];
}
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(i=l;i<=r;i++) a[i]=b[i];
}
void mergesort(int l,int r)
{
int mid=(l+r)>>1;
if(l==r) return;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,mid,r);
}
int main()
{
int n;
while(1)
{
scanf("%d",&n);
if(n==0) break;
ans=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
mergesort(1,n);
cout<<ans<<endl;
}
return 0;
}
快排:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double db;
typedef pair<int,int> pii;
typedef vector<int> vi;
#define de(x) cout << #x << "=" << x << endl
#define rep(i,a,b) for(int i=a;i<(b);++i)
#define all(x) (x).begin(),(x).end()
#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define fi first
#define se second
const int N = 1e5+5;
int a[N];
int partition(int l,int r)
{
int i=l-1,j=r,temp;
int tmp=a[r];
/*将大于等于x的元素交换到右区域*/
/*小于等于交换到左区域*/
while(1)
{
while(a[++i]<tmp);
while(tmp<a[--j]) if(j==l) break;
if(i>=j) break;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
temp=a[r];
a[r]=a[i];
a[i]=temp;
return i;
}
void qsort(int l,int r)
{
int i;
if(r<=l) return ;
i = partition(l,r);
qsort(l,i-1);
qsort(i+1,r);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
qsort(1,n);
for(int i=1;i<=n;i++) printf("%d%c",a[i],i==n ? '
':' ');
}