代码:
#include <iostream>
using namespace std;
//逆序对
int InversePairCore(int* pArray, int* pCopy, int start, int end)
{
if (start == end)
{
pCopy[start] = pArray[start];
return 0;
}
int len = (end - start)/2;
int left_count = InversePairCore(pCopy, pArray, start, start + len);
int right_count = InversePairCore(pCopy, pArray, start + len + 1, end);
//指向前一半的尾元素
int i = start + len;
//指向后一半的尾元素
int j = end;
//排序后的数组的索引
int copy_index = end;
//逆序对计数
int merge_count = 0;
while (i >= start && j >= start + len + 1)
{
if (pArray[i] > pArray[j])
{
pCopy[copy_index--] = pArray[i--];
merge_count += j - start - len;
}
else
{
pCopy[copy_index--] = pArray[j--];
}
}
for (; i >= start;--i)
{
pCopy[copy_index--] = pArray[i];
}
for (; j >= start + len + 1; --j)
{
pCopy[copy_index--] = pArray[j];
}
return left_count + right_count + merge_count;
}
int InversePair(int* pArray, const int nLength)
{
if (pArray == nullptr || nLength <= 0)
return 0;
int* pCopy = new int[nLength];
for (int i = 0; i < nLength; i++)
{
pCopy[i] = pArray[i];
}
int result = InversePairCore(pArray, pCopy, 0, nLength - 1);
delete[] pCopy;
return result;
}
int main()
{
int array[] = { 7, 5, 6, 4 };
const int array_length = sizeof(array) / sizeof(array[0]);
cout << "逆序对数为: " << InversePair(array, array_length);
cout << endl;
system("pause");
return 0;
}
测试: