c++ 逆序对

c/c++

浏览数:236

2019-7-24

AD:资源代下载服务

c++ 求逆序对

例如数组(3,1,4,5,2)的逆序对有(3,1)(3,2)(4,2)(5,2)共4个
逆序对就是左边的元素比右边的大,那么左边的元素和右边的元素就能产生逆序对
代码跟归并排序差不多

代码

#include <bits/stdc++.h>
using namespace std;
int a[100];
int r[100];
int ans = 0;
void sort(int s,int t)
{
    if (s == t)
        return ;
    else
    {
        int mid = (s + t) / 2;
        sort(s,mid);//排序mid前面部分
        sort(mid + 1,t);//排序好mid后面部分
        int i = s,j = mid + 1,k = s;
        while (i <= mid && j <= t)
        {
            if (a[i] <= a[j])
            {
                r[k] = a[i];
                k ++;
                i ++;
            }
            else
            {
                r[k] = a[j];
                k ++;
                j ++;
                //ans += mid - i + 1;
                ans = ans + mid - i + 1;//逆序对个数公式
            }
        }
        while (i <= mid)
        {
            r[k] = a[i];
            k ++;
            i ++;
        }
        while (j <= t)
        {
            r[k] = a[j];
            k ++;
            j ++;
        }
        for (int i = s;i <= t;i ++)
            a[i] = r[i];
    }
}
int main()
{
    int n;
    cin >> n;
    for (int i = 1;i <= n;i ++)//输入
    {
        cin >> a[i];
    }
    sort(1,n);
    cout << ans << endl;//ans就是逆序对的个数
    cout << endl;
    return 0;
}

理解

对于ans = ans + mid – i + 1这个公式,我是这么理解的

作者:牛大了的牛大