归并排序

 1class Solution {
 2public:
 3    int merge(vector<int> &a, vector<int> &t, int l, int m, int r)
 4    {
 5        for (int i = l; i <= r; ++i)
 6            t[i] = a[i];
 7
 8        int inv = 0, i = l, j = m + 1;
 9        for (int k = l; k <= r; ++k) {
10            if (i > m)
11                a[k] = t[j++];
12            else if (j > r)
13                a[k] = t[i++];
14            else if (t[i] <= t[j])
15                a[k] = t[i++];
16            else {
17                a[k] = t[j++];
18                inv += m - i + 1;  // 左边有序,i~m 都大于 j
19            }
20        }
21        return inv;
22    }
23
24    int msort(vector<int> &a, vector<int> &t, int l, int r)
25    {
26        if (l >= r) return 0;
27        int inv = 0, m = l + (r - l) / 2;
28        inv += msort(a, t, l, m);
29        inv += msort(a, t, m + 1, r);
30        inv += merge(a, t, l, m, r);
31        return inv;
32    }
33
34    int reversePairs(vector<int> &record)
35    {
36        vector<int> tmp(record.size());
37        return msort(record, tmp, 0, record.size() - 1);
38    }
39};