如 5 8 10 | 3 4两个有序序列,5>3,则8>3,10>3 核心 归并排序 #include <stdio.h> #include <stdlib.h> #include <iostream> using namespace std; int iMatrix[1000005]; int CompactMatrix[1000005]; __int64 fnum; void Merge(int a1,int a2,int b1,int b2) { int i=a1,j=b1,s=0; while (i<=a2&&j<=b2) { if (iMatrix[i]<=iMatrix[j]) CompactMatrix[s++]=iMatrix[i++]; else { CompactMatrix[s++]=iMatrix[j++]; fnum+=(a1+b2)/2-i+1; } } while (i<=a2) CompactMatrix[s++]=iMatrix[i++]; while (j<=b2) CompactMatrix[s++]=iMatrix[j++]; i=a1; while (i<=b2) { iMatrix[i]=CompactMatrix[i-a1]; i++; } } void MergeSort(int sleft,int sright) { int middle=(sleft+sright)/2; if (sleft<sright) { MergeSort(sleft,middle); MergeSort(middle+1,sright); Merge(sleft,middle,middle+1,sright); } } int main() { int t,num,i; freopen("E://input.txt","r",stdin); scanf("%d",&t); while (t--) { scanf("%d",&num); for (i=0;i<num;i++) scanf("%d",&iMatrix[i]); fnum=0; MergeSort(0,num-1); printf("%I64d/n",fnum); } return 0; }