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 }