1 #include<iostream>
2 using namespace std;
3
4 int InversePairsCore(int *data, int * copy, int start, int end)
5 {
6 if (start == end)
7 {
8 copy[start] = data[end];
9 return 0;
10 }
11 int length = (end - start) / 2;
12
13 int left = InversePairsCore(copy, data, start, start + length);
14 int right = InversePairsCore(copy, data, start + length+1,end);
15
16 int i = start + length;
17 int j = end;
18 int indexcopy = end;
19 int count = 0;
20 while (i >= start&&j >= start + length + 1)
21 {
22 if (data[i] > data[j])
23 {
24 copy[indexcopy--] = data[i--];
25 count = j - start - length;
26 }
27 else
28 {
29 copy[indexcopy--] = data[j--];
30 }
31 }
32 for (; i >= start; i--)
33 copy[indexcopy--] = data[i];
34 for (; j >= start + length + 1; j--)
35 copy[indexcopy--] = data[j];
36 return left + right + count;
37 }
38 int inversepairs(int *data, int length)
39 {
40 if (data == NULL || length <= 0)
41 return 0;
42 int *copy = new int[length];
43 for (int i = 0; i < length; i++)
44 copy[i] = data[i];
45 int count = InversePairsCore(data, copy, 0, length - 1);
46 for (int i = 0; i < length; i++)
47 cout << copy[i] << " ";
48 cout << endl;
49 return count;
50
51 }
52
53 int main()
54 {
55 int data[] = { 7, 5, 6, 4 };
56 cout << inversepairs(data, 4);
57 cin.get();
58 return 0;
59 }