给定一个数组,求其逆序对有多少个?
求数组中的逆序对数,我们可以想到用归并排序的方法,归并排序具体是将两个或者两个以上的有序表合成新的有序表。
假设我们现在有两个有序的表 S[0,mid],S[mid+1,high] 我们在合并这两个表的时候需要比较这两个表中元素的大小,假设 i
∈
[0,mid] j
∈
[mid+1,high]. 有S[i] > S[j] 那么我们可以得到位于S[i] 之后的每个元素都 大于 S[j]且都和S[j]构成一个逆序对。
int Merge(vector<int> &A,int low , int high,vector<int> tmp)
{
int i = low;
int mid = (low + high) / 2;
int j = mid + 1;
int cnt = 0;
while ( i <= mid && j <= high) {
if (A[i] > A[j]){
tmp.push_back(A[j++]);
//cnt += high- j + 1;
//ans += mid - i + 1;
cnt += mid - i + 1;
}
else
tmp.push_back(A[i++]);
}
while (i <= mid) tmp.push_back(A[i++]);
while (j <= high) tmp.push_back(A[j++]);
for (int i = low,k=0; i<= high && k < tmp.size(); ++i)
A[i] = tmp[k++];
return cnt;
}
int MergeSort(vector<int> &A, int low, int high)
{ int left,right,res;
if (low < high) {
int mid = (low + high)/2;
vector<int> tmp;
left = MergeSort(A,low,mid);
right = MergeSort(A,mid+1,high);
res = Merge(A,low,high,tmp);
return res + left + right;
}
else
return 0;
}