逆序对数量(归并排序做法)

news2024/12/23 18:24:31

 

先给出上一篇文章归并排序模板-CSDN博客里的归并排序模板:

#include<iostream>
using namespace std;

const int N = 100010;

int n;
int q[N], temp[N];

void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int mid = (l+r) >> 1;
    
    merge_sort(q, l, mid), merge_sort(q, mid+1, r);
    
    int i = l, j = mid+1, k = 0;
    while(i <= mid && j <= r) //对应步骤(3),而且当两个数组的指针都没有越界时才这么做
    {
        if(q[i] < q[j]) temp[k++] = q[i++];
        else            temp[k++] = q[j++];
    }
    while(i <= mid)     temp[k++] = q[i++]; //如果i没有越界,则将i后面的原封不动地拷贝进去
    while(j <= r)       temp[k++] = q[j++]; //如果j没有越界,则将j后面拷贝进去
    
    //q和temp数组的范围不同,因此需要两个变量i,j
    //         注意不是i <= n
    for(int i=l, j=0; i <= r; ++i, ++j) q[i] = temp[j]; //步骤(4),注意写法
}

int main()
{
    scanf("%d", &n);
    
    for(int i=0;i<n;++i) scanf("%d", &q[i]);
    
    merge_sort(q, 0, n-1);
    
    for(int i=0;i<n;++i) printf("%d ", q[i]);
    
    return 0;
}

 下面是求逆序对的过程,可以看到只需要在归并过程中加入计算逆序对数量的步骤即可。

#include<iostream>
using namespace std;

const int N = 100010;

int n = 0;
int q[N], temp[N];
long long res = 0;

void merge_sort(int q[], int l, int r)
{
    if(l >= r) return;
    
    int mid = (l+r) >> 1;
    
    merge_sort(q, l, mid), merge_sort(q, mid+1, r);
    
    int i = l, j = mid+1, k = 0;
    while(i <= mid && j <= r)
    {                                       //归并排序里这里也可以是≤号
        if(q[i] <= q[j]) temp[k++] = q[i++];//由于逆序对需要严格大于,因此这里是≤号
        else
        {
            temp[k++] = q[j++];
            res += mid - i + 1;//和归并排序不一样,由于i肯定小于j,因此只有
                               //当q[i]>q[j]时才是逆序对,而且[i,mid]范围内的所有数都能
                               //和q[j]构成逆序对,共mid-i+1个。
        }
    }
    while(i <= mid)     temp[k++] = q[i++]; 
    while(j <= r)       temp[k++] = q[j++]; 
    
    for(int i=l, j=0; i <= r; ++i, ++j) q[i] = temp[j]; //这一步不能省去
}

int main()
{
    cin>>n;
    
    for(int i=0;i<n;++i) cin>>q[i];
    
    merge_sort(q, 0, n-1);
    
    cout<<res;
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1405021.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

大家好&#xff0c;今天用SpringBoot、vue写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 &#xff0c;包含前端和后端&#xff0c;可以直接运行 使用本技术实现的项目&#xff1a;aicnn.cn&#xff0c;欢迎大家体验 如果文章知识点有错误的地方&#xf…

HTTPS基本概念

HTTP 与 HTTPS 有哪些区别&#xff1f; HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相…

VScode 好用的插件合集

VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主&#xff0c;让其同…

如何保持工业产线业务安全稳定运行?IoT设备敏捷准入方案有诀窍

在工业数字化转型过程中&#xff0c;企业在工业产线和数字化场景&#xff0c;除了面临大量互联网终端&#xff0c;还有传统的工控终端和新加入的物联网&#xff08;IoT&#xff09;设备。在日益严峻的网络攻击面前&#xff0c;工控终端和IoT设备几乎“裸奔”&#xff0c;传统安…

Text Workflow 1.8.2 mac文本转换处理

Text Workflow for mac是一款易于使用但功能强大的应用程序&#xff0c;可将任何文本转换成您需要的格式&#xff0c;以满足您的需求。Text Workflow具有广泛&#xff08;并不断增长&#xff09;的文本转换操作列表&#xff0c;可以实现各种功能。 软件下载&#xff1a;Text Wo…

HarmonyOS 发送http网络请求

好 本文 我们来说 http请求 首先 我们要操作网络内容 需要申请权限 项目中找到 main目录下的module.json5 最下面加上 "requestPermissions": [{"name": "ohos.permission.INTERNET"} ]这里 我在本地写了一个get接口 大家可以想办法 弄一个后…

python Seq2Seq模型源码实战,超详细Encoder-Decoder模型解析实战;早期机器翻译模型源码demo

1.Seq2Seq&#xff08;Encoder-Decoder&#xff09;模型简介 Seq2Seq&#xff08;Encoder-Decoder&#xff09;模型是一种常用于序列到序列&#xff08;sequence-to-sequence&#xff09;任务的深度学习模型。它由两个主要的组件组成&#xff1a;编码器&#xff08;Encoder&am…

H6201L 150V降压芯片 48V 60V 72V 90V 100V 120V降33V 12V 5V 控制器

电动车控制器中的降压芯片也是一种电源管理芯片&#xff0c;用于调整和稳定电动车的电源输出电压。其工作原理与一般降压恒压芯片类似&#xff0c;但在电动车控制器中有一些特定的应用和考虑因素。 降压模式&#xff08;Buck Mode&#xff09;:输入电压通常由电动车的电池提供&…

Qt采集本地摄像头推流成rtsp/rtmp(可网页播放/支持嵌入式linux)

一、功能特点 支持各种本地视频文件和网络视频文件。支持各种网络视频流&#xff0c;网络摄像头&#xff0c;协议包括rtsp、rtmp、http。支持将本地摄像头设备推流&#xff0c;可指定分辨率和帧率等。支持将本地桌面推流&#xff0c;可指定屏幕区域和帧率等。自动启动流媒体服…

基于PHP反序列化练习

PHP创建一个以自己姓名命名的类&#xff0c;要求存在两个属性&#xff0c;name&#xff0c;age&#xff0c;进行序列化&#xff0c;输出序列化以后的数据。 <!-- PHP创建一个以自己姓名命名的类&#xff0c;要求存在两个属性&#xff0c;name&#xff0c;age --> <?…

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器

18.鸿蒙HarmonyOS App(JAVA)日期选择器-时间选择器 点击button按钮触发事件显示月份与获取的时间 Button button3 (Button) findComponentById(ResourceTable.Id_button3);button3.setClickedListener(new Component.ClickedListener() {Overridepublic void onClick(Compon…

让二叉树无处可逃

志不立&#xff0c;天下无可成之事。 ——王阳明 二叉树 1、树&#xff1f;什么是树1、1、基本概念1、2、树的相关概念1、3、树的表示方式1、4、树的实际运用 2、二叉树&#xff1f;只有两个分支吗&#xff1f;2、1、基本概念2、2、二叉树的相关定义2、3、二叉树的相关性质2、4…

Java_网络编程

一、网络编程概述 网络编程的意思就是编写的应用程序可以与网络上其他设备中的应用程序进行数据交互。 网络编程有什么用呢&#xff1f;这个就不言而喻了&#xff0c;比如我们经常用的微信收发消息就需要用到网络通信的技术、在比如我们打开浏览器可以浏览各种网络、视频等也…

Pytest中conftest.py的用法

Pytest中conftest.py的用法 ​ 在官方文档中&#xff0c;描述conftest.py是一个本地插件的文件&#xff0c;简单的说就是在这个文件中编写的方法&#xff0c;可以在其他地方直接进行调用。 注意事项 只能在根目录编写conftest.py 插件加载顺序在搜集用例之前 基础用法 这里…

如何通过系统命令排查账号安全?

如何通过系统命令排查账号安全 query user 查看当前登录账号 logoff id 注销用户id net user 查看用户 net user username 查看用户登录情况 lusrmgr.msc 查看隐藏账号 winR打开regedit注册表 找到计算机\HEKY_LOCAL_MACHINE\SAM\SAM\右键给与用户读写权限 刷新打开 HKEY…

selenium代理ip可用性测试

测试代理ip是否工作正常&#xff0c;将正常的代理ip提取出来 from selenium import webdriver from fake_useragent import UserAgent def check_proxy(proxy):print("开始测试&#xff1a;"proxy)chrome_options webdriver.ChromeOptions()chrome_options.add_arg…

一、认识 JVM 规范(JVM 概述、字节码指令集、Class文件解析、ASM)

1. JVM 概述 JVM&#xff1a;Java Virtual Machine&#xff0c;也就是 Java 虚拟机 所谓虚拟机是指&#xff1a;通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的计算机系统。 即&#xff1a;虚拟机是一个计算机系统。这种计算机系统运行在完全隔离的环境中…

大数据学习之Flink,Flink的安装部署

Flink部署 一、了解它的关键组件 客户端&#xff08;Client&#xff09; 作业管理器&#xff08;JobManager&#xff09; 任务管理器&#xff08;TaskManager&#xff09; 我们的代码&#xff0c;实际上是由客户端获取并做转换&#xff0c;之后提交给 JobManger 的。所以 …

centos 7.6 进入单用户模式

1、重启服务器&#xff0c;在选择内核界面使用上下箭头移动 2、选择内核并按“e” 将“RO”改成 rw ,删除 rhgb quiet 添加 init/bin/bash Ctrl X 进入单用户模式 为防止乱码&#xff0c;修改语言为英语 修改完密码建议输入&#xff1a;touch /.autorelabel 更新系统信…

喜讯 | 华院计算摘得“2023大数据产业年度创新技术突破”奖

2024年1月17日&#xff0c; 由数据猿和上海大数据联盟主办&#xff0c;上海市经济和信息化委员会、上海市科学技术委员会指导的“第六届金猿季&魔方论坛——大数据产业发展论坛”在上海市四行仓库举行。论坛以“小趋势大未来”为主题&#xff0c;围绕大数据产业的各个领域展…