面试题:数组中的逆序对

在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如吗,在数组{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<length;++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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值