在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int count = 0;
void merge(int a[], int left, int mid, int right)
{
int p = left;
int q = mid + 1;
int *buf = new int[right-left+1];
int curr = 0;
while (p <= mid && q <= right)
{
if (a[p] <= a[q])
{
buf[curr++] = a[p++];
}
else
{
buf[curr++] = a[q++];
count += mid-p+1;
}
}
while (p <= mid)
{
buf[curr++] = a[p++];
}
while (q <= right)
{
buf[curr++] = a[q++];
}
for (int i = 0; i < curr; i++)
{
a[left+i] = buf[i];
}
delete []buf;
}
void mergeSort(int a[], int left, int right)
{
if (left >= right)
{
return;
}
int mid = left + (right-left)/2;
mergeSort(a, left, mid);
mergeSort(a, mid+1, right);
merge(a, left, mid, right);
}
int fun(int a[], int n)
{
count = 0;
mergeSort(a, 0, n-1);
return count;
}