计算逆序对数

简介: 计算逆序对数

计算逆序对

数学术语

逆序对,数学术语,设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。

如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数

c++ 版

实现原理:归并排序

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
int q[N], tmp[N];
LL merge_sort(int q[], int l, int r)
{
    if (l >= r) return 0;
    int mid = l + r >> 1;
    LL res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r);
    int k = 0, i = l, j = mid + 1;
    while (i <= mid && j <= r)
    {
        if (q[i] <= q[j]) tmp[k ++] = q[i ++];
        else
        {
            tmp[k ++] = q[j ++];
            res += mid - i + 1;    // 如果左区间的数大于有区间的一个数 那么左区间的这个数和它之后的数都大于右区间的这个数
                                   // 都可以组成 对
        }
    }
    while (i <= mid) tmp[k ++] = q[i ++];
    while (j <= r) tmp[k ++] = q[j ++];
    for (i = l, j = 0; i <= r; ++i, ++j) q[i] = tmp[j];
    return res;
}
int main()
{
    cout << "输入数字的个数:";
    cin >> n;
    cout << "输入数字:";
    for (int i = 0; i < n; ++i) scanf ("%d", &q[i]);
    cout << merge_sort(q, 0, n - 1) << endl;
    return 0;
}

JAVA版

import java.util.Scanner;
public class Main {
  public static final int N = 100010; // 这里不能写 1e5 + 10 这个是语法错误 // 这里相当于 c++的 const int N = 1e5 + 10;
  public static int [] temp = new int [N];   // 这里一定要记得前面加上 static 这里写static 的话那么上面那个也要写 或者全部方法 成员都不写
    public static void main(String[] args) {
        System.out.print("输入数字序列(例如123456):");
        Scanner sc = new Scanner(System.in);
        String digit = sc.nextLine();
        int [] arr = new int [digit.length()];
        for (int i = 0; i < digit.length(); ++ i) {
          arr[i] = (int)(digit.charAt(i) - '0');
        }
        System.out.println("逆序对数:" + merge_sort(arr, 0, digit.length() - 1));
    }   
    public static int merge_sort(int [] arr, int l, int r) {
      if (l >= r) return 0;                 
      int mid = l + r >> 1;
      int res = merge_sort(arr, l, mid) + merge_sort(arr, mid + 1, r);
      int i = l, j = mid + 1, k = 0;
      while (i <= mid && j <= r) {
        if (arr[i] <= arr[j]) {
          temp[k ++] = arr[i ++];
        } else {
          res += mid - i + 1;
          temp[k ++] = arr[j ++];
        }     
      }
      while(i <= mid) {
        temp[k ++] = arr[i ++];
      }
      while (j <= r) {
        temp[k ++] = arr[j ++];
      }
      for (i = l, k = 0; i <= r; i ++) {
        arr[i] = temp[k ++];
      }
      return res;
    }
}

Python版

def merge_sort(nums):
    if (len(nums) <= 1):
        return 0
    mid = len(nums) // 2
    L = nums[:mid]
    R = nums[mid:]
    ans = merge_sort(L) + merge_sort(R)
    i = j = k = 0
    while i < len(L) and j < len(R):
        if L[i] <= R[j]:
            nums[k] = L[i]
            i += 1
            k += 1
        else:
            nums[k] = R[j]
            j += 1
            k += 1
            ans += len(L) - i
    while i < len(L):
        nums[k] = L[i]
        i += 1
        k += 1
    while j < len(R):
        nums[k] = R[j]
        k += 1
        j += 1
    return ans
print("输入数字序列: ", end="")
nums = input()
nums = list(map(int, list(nums)))
print(merge_sort(nums))
相关文章
|
前端开发
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
开发过程中遇到过的docx、pptx、xlsx、pdf文件预览多种方式
448 0
|
Prometheus 监控 Cloud Native
SpringBoot+Prometheus+Grafana 实现自定义监控
SpringBoot+Prometheus+Grafana 实现自定义监控
|
canal 编解码 人工智能
Google Earth Engine(GEE)——OSM水图层 OpenStreetMap中的全球地表水数据集(90m分辨率)
Google Earth Engine(GEE)——OSM水图层 OpenStreetMap中的全球地表水数据集(90m分辨率)
414 0
|
移动开发 前端开发 程序员
有哪些代码开源平台值得推荐?
开源是程序员最高的浪漫
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
前端开发 测试技术 Linux
芯片人的快乐——python+systemverilog用波形祝你新春快乐 |献上祝福语波形生成器|
芯片人的快乐——python+systemverilog用波形祝你新春快乐 |献上祝福语波形生成器|
303 0
|
资源调度 JavaScript 前端开发
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
这篇文章是关于如何使用vue-cli搭建vue环境,并整合Element UI和vue-router来开发一个基础的前端管理后台界面。
646 0
vue-element-admin 综合开发一:搭建环境:vue-cli创建项目,整合element、vue-router
|
计算机视觉 Python
10个使用NumPy就可以进行的图像处理步骤
这篇文章介绍了使用NumPy进行图像处理的10个基本步骤,包括读取图像、缩小图像、水平和垂直翻转、旋转、裁剪、分离RGB通道、应用滤镜(如棕褐色调)、灰度化、像素化、二值化以及图像融合。通过这些简单的操作,读者可以更好地掌握NumPy在图像处理中的应用。示例代码展示了如何实现这些效果,并配有图像结果。文章强调这些方法适合初学者,更复杂的图像处理可使用专门的库如OpenCV或Pillow。
522 5
|
缓存 安全 Linux
|
SQL 存储 缓存
一条 SQL 查询语句是如何运行?
本文详细剖析了SQL语句在MySQL中的执行流程,涵盖客户端、Server层及存储引擎层。Server层包括连接器、查询缓存、分析器、优化器与执行器等核心组件。连接器管理连接与权限校验,查询缓存加速查询,分析器负责词法与语法分析,优化器提升SQL性能,执行器调用存储引擎接口。了解这些流程有助于深入理解MySQL内部机制及其优化原理。
366 0