面试题:数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如吗,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。

思路:作者给出的是基于归并排序的一种算法。那么必然比暴力的O(n^2)的好。

代码如下:

int InversePairs(int* data,int length)

{

 if(data==nullptr||length<0)

 return 0;

 int* copy=new int[length];

for(int i=0;i

{

 copy[i]=data[i];

}

int count=InversePairsCore(data,copy,0,length-1);

delete[] copy;

}

int InversePairsCore(int* data,int* copy,int start,int end)

{

 if(start==end)

{

 copy[start]=data[start];

return 0;

}

int length=(end-start)/2;

int left=InversePairsCore(copy,data,start,start+length);

int right=InversePairsCore(copy,data,start+length+1,end);

int i=start+length;

int j=end;

int indexCopy=end;

int count=0;

while(i>=start&&j>=start+length+1)

{

 if(data[i]>data[j])

{

 copy[indexCopy--]=data[i--];

   count+=j-start-length;

}

else

{

 copy[indexCopy--]=data[j--];

}

 }

 for(;i>=start;--i)

 copy[indexCopy--]=data[i];

 for(;j>=start+length+1;--j)

 copy[indexCopy--]=data[j];

 return left+right+count;

}

你可能感兴趣的:(面试算法题)