剑指offer51数字中的逆序对
class Solution {
public :
int InversePairs ( vector< int > data) {
int len = data. size ( ) ;
if ( len == 0 ) return 0 ;
vector< int > tmp ( len) ;
int ret = 0 ;
mergeSort ( data, tmp, 0 , len - 1 , ret) ;
return ret;
}
private :
void merge_ ( vector< int > & data, vector< int > & tmp, int ll, int lr, int rl, int rr, int & ret)
{
int i = ll, j = rl;
int index = 0 ;
while ( i <= lr && j <= rr) {
if ( data[ i] > data[ j] ) {
ret + = lr - i + 1 ;
ret = ret % 1000000007 ;
tmp[ index++ ] = data[ j++ ] ;
}
else {
tmp[ index++ ] = data[ i++ ] ;
}
}
while ( i <= lr) {
tmp[ index++ ] = data[ i++ ] ;
}
while ( j <= rr) {
tmp[ index++ ] = data[ j++ ] ;
}
for ( int i = ll, j = 0 ; j < index; i++ , j++ ) {
data[ i] = tmp[ j] ;
}
}
void mergeSort ( vector< int > & data, vector< int > & tmp, int l, int r, int & ret)
{
if ( l < r) {
int m = l + ( r - l) / 2 ;
mergeSort ( data, tmp, l, m, ret) ;
mergeSort ( data, tmp, m + 1 , r, ret) ;
merge_ ( data, tmp, l, m, m + 1 , r, ret) ;
}
}
} ;