目标:
归并排序使用的就是分治思想。分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。从我刚才的描述,你有没有感觉到,分治思想跟我们前面讲的递归思想很像。是的,分治算法一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突。
数组中的逆序对:
步骤:
class Solution {
private :
const int mod = 1000000007 ;
public :
void merge ( vector< int > & data, vector< int > & tmp, int left, int right, int & ret) {
if ( left >= right)
return ;
int mid = ( left + right) / 2 ;
merge ( data, tmp, left, mid, ret) ;
merge ( data, tmp, mid + 1 , right, ret) ;
merge2 ( data, tmp, left, mid, right, ret) ;
}
void merge2 ( vector< int > & data, vector< int > & tmp, int left, int mid, int right, int & ret) {
int i = left, j = mid + 1 , k = 0 ;
while ( i <= mid && j <= right) {
if ( data[ i] > data[ j] ) {
tmp[ k++ ] = data[ j++ ] ;
ret += ( mid - i + 1 ) ;
ret %= mod;
} else {
tmp[ k++ ] = data[ i++ ] ;
}
}
while ( i <= mid) {
tmp[ k++ ] = data[ i++ ] ;
}
while ( j <= right) {
tmp[ k++ ] = data[ j++ ] ;
}
for ( k = 0 , i = left; i <= right; ++ i, ++ k) {
data[ i] = tmp[ k] ;
}
}
int InversePairs ( vector< int > data) {
int ret = 0 ;
vector< int > tmp ( data. size ( ) ) ;
merge ( data, tmp, 0 , data. size ( ) - 1 , ret) ;
return ret;
}
} ;