其他分享
首页 > 其他分享> > 逆序对解法

逆序对解法

作者:互联网

例题

原题链接:https://www.acwing.com/problem/content/790/

给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。

暴力解法

不推荐,两重循环遍历,O(n^2)的复杂度,容易TLE;

#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int n;
int cnt;
int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i++)
    {
        cin >> a[i];
    }
    for(int i = 0 ; i < n ; i++)
    {
        for(int j = i ; j < n ; j ++)
        {
            if(a[i] > a[j])
            {
                cnt++;
            }
        }
    }
    cout << cnt;
    return 0;
}

归并

#include<bits/stdc++.h>
using namespace std;
long long n , res;
int a[1000005] , tmp[1000005];
void m_sort(int a[] , int l , int r)
{
    if(l >= r)
    {
        return;
    }
    int mid = (l + r) >> 1;
    m_sort(a , l , mid);
    m_sort(a , mid+1 , r);
    int k = 0;
    int i = l,j = mid + 1;
    while(i <= mid && j <= r)
    {
        if(a[i] <= a[j])
        {
            tmp[k++] = a[i++];
        }
        else
        {
            tmp[k++] = a[j++];
            res += (mid - i + 1);
        }
    }
    while(i <= mid)
    {
        tmp[k++] = a[i++];
    }
    while(j <= r)
    {
        tmp[k++] = a[j++];
    }
    for(int i = l , j = 0;i <= r ; i++ ,j++)
    {
        a[i] = tmp[j];
    }
    
}
int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i++)
    {
        cin >> a[i];
    }
    m_sort(a , 0 , n - 1);
    cout << res;
    
    return 0;
}

标签:sort,int,1000005,mid,++,解法,逆序
来源: https://www.cnblogs.com/RimekeyBergling/p/16504513.html