#include <stdio.h>
#include <stdlib.h>
long long sum;
int a[100010];
int temp[100010];
void merge(int s1,int e1,int s2,int e2){
int p = 0;
int p1 = s1;
int p2 = s2;
while(p1<=e1&&p2<=e2){
if(a[p1]<=a[p2]){
temp[p++] = a[p1++];
}
else{
temp[p++] = a[p2++];
sum += (e1-p1+1); //当a[p2]<a[p1]时,说明a[p1]之后的也大于a[p2],所以应求出前面数组剩下的元素个数,逐次累加。
}
}
while(p1<=e1){
temp[p++]=a[p1++];
}
while(p2<=e2){
temp[p++]=a[p2++];
}
int i;
for(i=s1; i<=e2; i++){
a[i] = temp[i-s1];
}
}
void merge_sort(int l, int r){
int mid;
if(l<r){ //将数组分到最小
mid = (l+r)/2;
merge_sort(l, mid);
merge_sort(mid+1, r);
merge(l,mid,mid+1,r); //递归合并
}
}
int main()
{
int i,n;
scanf("%d",&n);
for(i=0; i<n; i++){
scanf("%d",&a[i]);
}
sum = 0;
merge_sort(0, n-1);
printf("%lld\n",sum);
return 0;
}
C语言--数据结构实验之排序五:归并求逆序数
最新推荐文章于 2023-01-13 18:49:06 发布