题意:
求完成排序后最少交换了几次,这道题,如果有了解,呢么就会知道是并归排序,把并归排序写下来,在并归排序中,求交换次数即可
AC代码:
#include<cstdio>
using namespace std;
//并归排序
#define ll long long
ll ans;
void Merge(int A[],int low,int mid,int high)
{
int *B=new int [high-low+1];//申请一个辅助数组
int i=low,j=mid+1,k=0;
while(i<=mid&&j<=high)
{
if(A[i]<=A[j])
{
B[k++]=A[i++];
}
else
{
B[k++]=A[j++];
ans+=(mid+1-i);//求交换了几次,因为并归排序本身就是最优
}
}
while(i<=mid)
B[k++]=A[i++];
while(j<=high)
B[k++]=A[j++];
for(i=low,k=0; i<=high; i++)
{
A[i]=B[k++];
}
delete []B;
}
void MergeSort(int A[],int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
MergeSort(A,low,mid);
MergeSort(A,mid+1,high);
Merge(A,low,mid,high);
}
}
int main()
{
int a[500005],n;
while(~scanf("%d",&n)&&n)
{
//memset(a,0,sizeof(a));
ans=0;
for(int i=0; i<n; i++)
{
scanf("%d",&a[i]);
}
MergeSort(a,0,n-1);
//for(int i=0;i<n;i++)
//cout<<a[i]<<' ';
printf("%lld\n",ans);
}
}