// 面试题51:数组中的逆序对
// 题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组
// 成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。
static uint32_t inverse_pairs(std::vector<int>& arr)
{
if(arr.size() < 1)
{
return 0;
}
std::vector<int> copy(arr.size());
for(uint32_t i = 0; i < arr.size(); ++i)
{
copy[i] = arr[i];
}
return _inverse_pairs(arr, copy, 0, arr.size() - 1);
}
static uint32_t _inverse_pairs(std::vector<int>& arr, std::vector<int>& copy,
uint32_t start, uint32_t end)
{
if(start == end)
{
copy[start] = arr[start];
return 0;
}
auto mid = ((end + start) >> 1);
auto left = _inverse_pairs(copy, arr, start, mid);
auto right = _inverse_pairs(copy, arr, mid + 1, end);
// i初始化为前半段最后一个数字的下标
int i = mid;
// j初始化为后半段最后一个数字的下标
int j = end;
int index = end;
uint32_t count = 0;
while(i >= start && j >= mid + 1)
{
if(arr[i] > arr[j])
{
copy[index--] = arr[i--];
count += j - mid;
}
else
{
copy[index--] = arr[j--];
}
}
for(; i >= start; --i)
copy[index--] = arr[i];
for(; j >= mid + 1; --j)
copy[index--] = arr[j];
return left + right + count;
}