归并排序时间复杂度O(nlogn),很稳定,一个很重要的应用就是求逆序对数,NOIP2013已考(CKY考试前一周才讲过,结果考试时直接否定了)。
例如有两个有序表:(7,10,13,15)和(4,8,19,20)
当前比较(7,4)4更小 加入数组 (4)
当前比较(7,8)7更小 加入数组 (4,7)
当前比较(10,8)8更小 加入数组 (4,7,8) ……
<pre name="code" class="html">#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,countt=0,a[1000000],temp[1000000],roll=0;
void Merge(int l,int r)
{
int mid=(l+r)/2,i,j,count=l;
if(mid>=l+1)
Merge(l,mid);
if(r>=mid+2)
Merge(mid+1,r);
i=l;
j=mid+1;
while(i<=mid&&j<=r)
{
if(a[i]<=a[j])
temp[count++]=a[i++];
else
{
countt+=mid-i+1;
temp[count++]=a[j++];
}
}
while(i<=mid)
temp[count++]=a[i++];
while(j<=r)
{
countt+=mid-i+1;
temp[count++]=a[j++];
}
for(int k=l;k<=r;k++)
a[k]=temp[k];
return;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<=n-1;i++)
scanf("%d",&a[i]);
Merge(0,n-1);
for(int i=0;i<=n-1;i++)
printf("%d ",a[i]);
printf("\n逆序对数:%d\n",countt);
return 0;
}