0
点赞
收藏
分享

微信扫一扫

归并排序求逆序数

王传学 2023-02-06 阅读 132



#include <stdio.h>
#include <string.h>

using namespace std;

const int mm = 1009;

int f[mm],nCount;

void Merge(int l,int mid1,int mid2,int r,int*f)
{
int t[mm],pos = 0,i=l,j=mid2;
while(i <= mid1 && j <= r)
{
if(f[i]<=f[j])
t[pos++] = f[i++];
else
{
t[pos++] = f[j++];
//i位后的都比f[j] 大
nCount += mid1-i+1;//j-mid2+1;
}
}
while(i <= mid1)
t[pos++] = f[i++];
while(j <= r)
t[pos++] = f[j++];
for(int i=0;i<pos;++i)
f[l+i] = t[i];
}

void MergeSort(int l,int r,int*f)
{
int mid = (l+r)/2;
if(l == r)
return;
MergeSort(l,mid,f);
MergeSort(mid+1,r,f);
Merge(l,mid,mid+1,r,f);
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;++i)
scanf("%d",&f[i]);
nCount = 0;
MergeSort(0,n-1,f);
printf("ni: %d\n",nCount);
for(int i=0;i<n;++i)
printf("%d ",f[i]);
putchar('\n');
}
return 0;
}



举报

相关推荐

0 条评论