public static int InversePair(int[] data,int start,int end,int[] temp)
{
int count=0; //累积逆序对的总数
if(start < end)
{
int mid = (end+start)/2;
count += InversePair(data, start, mid ,temp);
count += InversePair(data,mid+1,end,temp);
count += getInversePair(data,start,mid,end,temp);
}
return count;
}
private static int getInversePair(int[] data, int start,int mid, int end,int[] temp)
{
int i=mid; //前半部分的末尾
int count=0;
int j = end; //后半部分的末尾
int index=0;
while(i >=start && j>mid)
{
if(data[i] > data[j])
{
temp[index++] = data[i--];
count += j-mid; //j之前的所有元素都是逆序对数
}
else
{
temp[index++] = data[j--];
}
}
while(i>=start)
{
temp[index++] = data[i--];
}
while(j>mid)
{
temp[index++] = data[j--];
}
//将其排好序的放入原数组
for(int k=0;k<index;k++)
{
data[end-k] = temp[k];
}
return count;
}版权声明:本文为博主原创文章,转载请注明出处。
原文地址:http://blog.csdn.net/u014307117/article/details/47747277