c++ 逆序对

Posted lja001162

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 逆序对相关的知识,希望对你有一定的参考价值。

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++ 逆序对的主要内容,如果未能解决你的问题,请参考以下文章

逆序对的求解逆序对个数问题

一道编程题:求逆序对的个数

归并排序C++实现及求逆序对的个数

C++中用vector存放一个数组,对数组进行排序,并输出数组

逆序对

算法之逆序对