#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int Divid(int* a, int* b, int first, int last) {
if(first >= last) return 0; // 一个元素的情况下没有逆序数
int i,j,k=0,mid;
k=i=first;
int res=0;
mid=(first+last)/2;
j=mid+1;
res=Divid(a,b,i,mid)+Divid(a,b,j,last); // 递归计算两边的逆序数
// 计算两边相关联的数据的逆序数
while((i<=mid) && (j<=last)) {
if(a[i]<=a[j]) b[k++]=a[i++],res+=j-mid-1;
else b[k++]=a[j++]; // 是不是没有考虑a[i]=a[j]的问题
}
while(i<=mid) b[k++]=a[i++],res+=j-mid-1;
while(j<=last) b[k++]=a[j++];
// memcpy(a+first,b+first,sizeof(int)*(first-last+1));
for(i=first; i<=last;++i)
a[i]=b[i];
return res;
}
int main() {
int n;
printf("Enter n:");
scanf("%d",&n);
int* a=(int*) calloc(n, sizeof(int));
int* b=(int*) calloc(n, sizeof(int));
int i=0;
printf("Enter %d intrgers:",n);
for(i=0;i<n;++i) {
scanf("%d",(a+i));
}
printf("%lld",Divid(a,b,0,n-1));
return 0;
}
#include <string.h>
#include <stdlib.h>
int Divid(int* a, int* b, int first, int last) {
if(first >= last) return 0; // 一个元素的情况下没有逆序数
int i,j,k=0,mid;
k=i=first;
int res=0;
mid=(first+last)/2;
j=mid+1;
res=Divid(a,b,i,mid)+Divid(a,b,j,last); // 递归计算两边的逆序数
// 计算两边相关联的数据的逆序数
while((i<=mid) && (j<=last)) {
if(a[i]<=a[j]) b[k++]=a[i++],res+=j-mid-1;
else b[k++]=a[j++]; // 是不是没有考虑a[i]=a[j]的问题
}
while(i<=mid) b[k++]=a[i++],res+=j-mid-1;
while(j<=last) b[k++]=a[j++];
// memcpy(a+first,b+first,sizeof(int)*(first-last+1));
for(i=first; i<=last;++i)
a[i]=b[i];
return res;
}
int main() {
int n;
printf("Enter n:");
scanf("%d",&n);
int* a=(int*) calloc(n, sizeof(int));
int* b=(int*) calloc(n, sizeof(int));
int i=0;
printf("Enter %d intrgers:",n);
for(i=0;i<n;++i) {
scanf("%d",(a+i));
}
printf("%lld",Divid(a,b,0,n-1));
return 0;
}