【题目描述】
输入一个数组,求数组中逆序对的总数
【高效解法】
采用分治法,步骤上与归并排序一模一样
例{7, 5, 6, 4}
{7}和{5}产生1个逆序对(7, 5),按从小到大合并为{5, 7}
{6}和{4}产生1个逆序对(6, 4),按从小到大合并为{4, 6}
以{5, 7}和{4, 6}说明merge函数的流程
综上{7, 5, 6, 4}共有5个逆序对
【merge函数】
int merge( int p, int q, int r )
{
int n1 = q - p + 1, n2 = r - q;
int i, j, result = 0;
L[0] = -INF;
for( i = 1; i <= n1; i++ )
L[i] = s[p + i - 1];
R[0] = -INF;
for( j = 1; j <= n2; j++ )
R[j] = s[q + j];
i = n1;
j = n2;
for( int k = r; k >= p; k-- )
if( L[i] > R[j] )
{
result += j;
s[k] = L[i];
i--;
}
else
{
s[k] = R[j];
j--;
}
return result;
}
【merge_sort函数】
int merge_sort( int p, int r )
{
int result = 0;
if( p < r )
{
int q = ( p + r ) / 2;
result += merge_sort( p, q );
result += merge_sort( q + 1, r );
result += merge( p, q, r );
}
return result;
}
【练习】
nowcoder 数组中的逆序对
注意事项:vector对象作为函数参数时,需要加&符号,即定义为vector<int> &data,表示对象的别名为data,否则会对vector对象进行复制,造成TLE