zoukankan      html  css  js  c++  java
  • 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这个公式,我是这么理解的

  • 相关阅读:
    django core cache 永不失效配置
    zabbix-ODBC-oracle
    time
    zabbix中的触发器依赖
    Servlet1
    每周总结01
    使用IntelliJ IDEA集成TomCat
    hadoop环境配置
    《软件工程》学习进度条博客16
    03梦断代码读后感3
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11099792.html
Copyright © 2011-2022 走看看