排序算法
一、归并排序
#include <bits/stdc++.h>
using namespace std;
int a[1009],temp[1009],n,ans;
void merge(int a[],int l,int mid,int r,int temp[])
{
int p1=l,p2=mid+1,num=l;
while(p1<=mid&&p2<=r)
{
if(a[p1]<=a[p2]) temp[num++]=a[p1++];
else temp[num++]=a[p2++],ans+=mid-p1+1;
//若想用归并排序求逆序对,当a[p1]>a[p2]时,p1到mid的元素一定和a[p2]形成逆序对,即ans+=mid-p1+1;
}
while(p1<=mid) temp[num++]=a[p1++];
while(p2<=r) temp[num++]=a[p2++];
for(int i=l;i<=r;i++)
a[i]=temp[i];
return;
}
void mergesort(int a[],int l,int r,int temp[])
{
if(l<r)
{
int mid=(l+r)/2;
mergesort(a,l,mid,temp);
mergesort(a,mid+1,r,temp);
merge(a,l,mid,r,temp);
}
}
int main()
{
cin>>n;
int ans=0;
for(int i=1;i<=n;i++) cin>>a[i];
mergesort(a,1,n,temp);
}
二、快速排序
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10009];
void swap(int &a,int &b)
{
int temp=a;a=b;b=temp;
return;
}
void quicksort(int a[],int l,int r)
{
if(l>=r) return;
int i=l,j=r,k=a[l];//把比K小的移到左边,大的右边
while(i!=j)
{
while(j>i&&k<=a[j]) j--;
swap(a[i],a[j]);
while(j>i&&a[i]<=k) i++;
swap(a[i],a[j]);
}
quicksort(a,l,i-1);
quicksort(a,i+1,r);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
quicksort(a,1,n);
}