XDY18LIUDENGLIN @ 2019-11-17 14:51:48
#include<stdio.h>
#include<stdlib.h>
void getSumFun(int *nums,int s,int m,int e,long long *sum)
{
int i,j;
for(i=s; i<=m; i++)
for(j=m+1; j<=e; j++)
if(nums[i]>nums[j]) (*sum)++;
}
void getSum(int *nums,int s,int e,long long *sum)
{
int i,m;
if(s<e)
{
m=s+(e-s)/2;
getSum(nums,s,m,sum);
getSum(nums,m+1,e,sum);
getSumFun(nums,s,m,e,sum);
}
}
int main()
{
int N,i;
long long sum;
while(~scanf("%d",&N))
{
sum=0;
int *nums=(int*)malloc(sizeof(int)*N);
for(i=0; i<N; i++)
scanf("%d",&nums[i]);
getSum(nums,0,N-1,&sum);
printf("%lld\n",sum);
}
return 0;
}
by babyec @ 2019-11-17 15:17:54
你归并的并的方法不对。
两个有序的小数组合并成一个大数组的复杂度可以在O(n),而不是你这样嵌套循环的,在合并的过程中因为前后两个小部分分别有序,可以直接计算出这次的逆序对个数,加到sum里。
而且好像并没有真的并,看起来有点像啥呢,选择?冒泡?
emmm...我建议你先好好看看归并排序的算法讲解
by XDY18LIUDENGLIN @ 2019-11-17 15:23:26
@babyec OK,我好好去看看,谢谢了