对归并排序做一定的调整可以很方便的求出给定数组中的逆序对
思路: 对于数组A[1:n]中的逆序对数表示为N(A[1:n])
则有N(A[1:n]) = 左部逆序对数N(A[1:n/2]) + 右部逆序对数N(A[n/2+1:n]) + 对左右两部分归并产生的逆序对数
在归并时 对于两个有序数组A[1:n/2] A[n/2+1:n] 如果对于左右两数组的游标i j 有 A[i]>A[j]那么在将A[i]并入有序数组时, 还需要累加逆序对数 这里应该加上n/2-i+1 因为A[i: n/2]中每一个元素都将大于A[j]
另外 这里学到一些关于合并过程Merge的一段比较优美的代码:
int Merge(int s,int md,int t)
{
int left,right,i;
int *pTemp = new int[t-s+1];
left=s;
right=md+1;
int ans=0;
for(i=0; i<t-s+1 ;i++)
{
if(left<=md && (right>t || a[left]<=a[right]) )
{
lt[i]=a[left];
left++;
}
else
{
lt[i]=a[right];
right++;
ans+=md-l+1;
}
}
for(i=s; i<=t ;i++)
a[s+i]=lt[i];
}