下面是我整理刘汝佳算法的代码,按照自己格式改了改,还有另一种比较适合自己
#include<stdio.h>
#include<string.h>
#include<math.h>
#include <queue>
#include <iostream>
#include<algorithm>
using namespace std;
const int N=10000+2;
int A[N];
int T[N];
void Merge_sort(int l,int r)
{
if (r-l>1)
{
int mid=l+(r-l)/2;
int p=l,i=l,q=mid;
Merge_sort(l,mid);
Merge_sort(mid,r);
while (p<mid||q<r)
{
if (q>=r||(p<mid&&A[p]<=A[q]))
T[i++]=A[p++];
else
T[i++]=A[q++];
}
for (i=l;i<r;i++)
A[i]=T[i];
}
}
这是算法书里面的求逆序对的解法,但是它的合并比较好理解,用了三个循环#include<stdio.h>
#include<string.h>
#include<math.h>
#include <queue>
#include <iostream>
#include<algorithm>
using namespace std;
const int N=10000+2;
int A[N];
int B[N];
int r;
void merge(int l, int h) {
if (l >= h-1) {
return;
}
int m = l + (h - l) / 2;
merge(l, m);
merge(m, h);
int i = l, j = m, k = l;
while (i < m && j < h) {
if (A[i] > A[j]) {
B[k++] = A[j++];
r += m - i;
} else {
B[k++] = A[i++];
}
}
if (i < m) {
for (; i < m; i++) {
B[k++] = A[i++];
}
}
if (j < h) {
for (; j < h; j++) {
B[k++] = A[j++];
}
}
for (int x = l; x < h; x++) {
A[x] = B[x];
}
}
int main() {
int n;
while (cin>>n)
{
r=0;
for (int i=0;i<n;i++)
cin>>A[i];
merge(0, n);
for (int i = 0; i < n; i++) {
cout << A[i] << " ";
}
cout << endl;
cout << "reverse pair number is " << r << endl;
}
}