用归并排序
int __mergeSort(vector<int> &data, vector<int> copy, int l, int r) { if (l >= r) return 0; int mid =(l+r)>>1; //cout << "mid:" << mid << endl; int leftCount = __mergeSort(copy, data, l, mid); int rightCount = __mergeSort(copy, data, mid + 1, r); int count = 0; int i = l, j = mid + 1; for (int k = l; k <= r; k++) { if (i > mid) data[k] = copy[j++]; else if(j>r) data[k] = copy[i++]; else if(copy[i]<=copy[j]) data[k] = copy[i++]; else { //cout << "add:" << mid - i + 1; count += mid - i + 1; data[k] = copy[j++]; } } return leftCount + rightCount + count; } int InversePairs(vector<int>& data) { int n = data.size(); vector<int> copy; copy.assign(data.begin(), data.end()); return __mergeSort(data,copy, 0, n-1); }