Skip to content

Latest commit

 

History

History
56 lines (51 loc) · 1.03 KB

mergesort.md

File metadata and controls

56 lines (51 loc) · 1.03 KB

Сортировка слиянием, подсчет инверсий

struct Mergesort {
    int n;
    vector<ll> v;
    ll inversionCnt = 0;
    Mergesort(int _n)
    {
        n = _n;
        v.resize(n);
    }

    void load()
    {
        for (auto& d : v)
            cin >> d;
    }

    void merge(int l, int mid, int r)
    {
        int i = l, j = mid + 1;
        while (i <= mid && j <= r) {
            if (v[i] <= v[j]) {
                i++;
            }
            else {
                j++;
                inversionCnt += mid - i + 1;
            }
        }
        sort(v.begin() + l, v.begin() + r + 1);
    }

    void mergesort(int l, int r)
    {
        if (l < r) {
            int mid = (r + l) / 2;
            mergesort(l, mid);
            mergesort(mid + 1, r);
            merge(l, mid, r);
        }
    }
};

void solve()
{
    int n;
    while (cin >> n, n != 0) {
        Mergesort mergs(n);
        mergs.load();
        mergs.mergesort(0, n - 1);
        cout << mergs.inversionCnt << "\n";
    }
}