如果一对元素(A[i], A[j])是倒序的,即i < j但是A[i] > A[j],则他们被称为一个倒置。设计o(nlogn)的算法来计算数组中的倒置数量。
利用归并排序实现源码如下:
#include <iostream>
#include <cassert>
using namespace std;
void Merge(int *left, int leftSize, int *right, int rightSize, int *result, int &reverseNum)
{
int *left_end = left + leftSize;
int *right_end = right + rightSize;
while(left < left_end && right < right_end) {
if(*left > *right) {
*result++ = *right++;
reverseNum += (left_end - left);
} else
*result++ = *left++;
}
while(left < left_end)
*result++ = *left++;
while(right < right_end)
*result++ = *right++;
}
void MergeSort(int *arr, int len, int &reverseNum)
{
if(len == 1)
return;
int leftSize = len / 2, rightSize = len - len / 2;
int *left = new int[leftSize];
int *right = new int[rightSize];
for(int i = 0; i < leftSize; i++)
left[i] = arr[i];
for(int i = 0; i < rightSize; i++)
right[i] = arr[i + leftSize];
MergeSort(arr, leftSize, reverseNum);
MergeSort(arr + leftSize, rightSize, reverseNum);
Merge(left, leftSize, right, rightSize, arr, reverseNum);
delete[] left;
delete[] right;
}
int calReversePair(int *arr, int len)
{
assert(arr);
int reverseNum = 0;
MergeSort(arr, len, reverseNum);
return reverseNum;
}
int main()
{
int a[] = {8, 7, 6, 5, 4, 3, 2, 1};
cout << calReversePair(a, sizeof(a) / sizeof(a[0])) << endl;
return 0;
}
运行结果为:28