码迷,mamicode.com
首页 > 编程语言 > 详细

c++ 逆序对

时间:2019-06-27 21:51:51      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:turn   png   img   oid   元素   bit   info   cout   lse   

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这个公式,我是这么理解的

技术图片

c++ 逆序对

标签:turn   png   img   oid   元素   bit   info   cout   lse   

原文地址:https://www.cnblogs.com/LJA001162/p/11099792.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!