归并排序 与 逆序对数量

news2024/11/26 10:21:08

一、归并排序

 题目:

        给定你一个长度为 n 的整数数列,请你使用归并排序对这个数列按照从小到大进行排序,并将排好序的数列按顺序输出。

输入格式:

        输入共两行,第一行包含整数 n。

        第二行包含 n个整数(所有整数均在 1∼1e9 范围内),表示整个数列。

数据范围:

        0 < n < 100000

解题思路:

        如果单纯做出来这道题方法有很多种,只要要求时间复杂度为O(n log n)即可。使用内置函数sort排序也可以AC,但是这道题目要求咱们使用归并排序,那咱们就以这道题为例讲一下归并排序。

        1.归并排序主要是通过将一个数组进行log n次分解,直至每个数组元素个数为1。以[1,5,3,4,6,2]数组为例,第一次分解为[1,5,3] 和 [4,6,2] 。数组元素个数不为1,继续将数组分解,第二次分解[1,5]和[3]和[4,6]和[2]。还有两个数组没有元素个数不为1。继续进行数组分解。第三次分解成[1]和[5]和[3]和[4]和[6]和[2]每个数组元素个数都已经为1。完成了归并排序的第一个环节。

        

        2. 第一步的铺垫已经完成,第二步就是需要把每个数组进行按照从大到小的顺序进行合并,第一次合并之后是两个元素,第二次合并就是二元素个数与一元素个数数组合并,此时用双指针法能够将两个数组元素的从小到大顺序排列出来。还是拿[1,5,3,4,6,2]数组为例,第一步得到的是[1]和[5]和[3]和[4]和[6]和[2],第一次合并为[1,5] 和[3]和[4,6]和[2]。第二次合并为[1,3,5]和[2,4,6]。第三次合并为[1,2,3,4,5,6]。

 

 log n次分解、log n合并为归并排序

动图展示

实现代码 

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int q[N];
int temp[N];
void mergeSort(int q[],int l,int r)
{
    if(l>=r) return;
    int mid=(l+r)/2;
    mergeSort(q,l,mid);
    mergeSort(q,mid+1,r);
    int k=0;
    int i=l;
    int j=mid+1;
    while(i<=mid&&j<=r)
    {
        if(q[i]<=q[j])
        {
            temp[k++]=q[i++];
        }
        else{
            temp[k++]=q[j++];
        }
    }
    while(i<=mid)
    {
        temp[k++]=q[i++];
    }
    while(j<=r)
    {
        temp[k++]=q[j++];
    }
    for(int a=l,b=0;a<=r;a++,b++)
    {
        q[a]=temp[b];
    }
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
    }
    mergeSort(q,0,n-1);
    for(int i=0;i<n;i++)
    {
        cout<<q[i]<<" ";
    }
}

 二、逆序对数量

题目:

        给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j个元素,如果满足 i<j且 a[i]>a[j],则其为一个逆序对;否则不是。

输入格式

第一行包含整数 n,表示数列的长度。

第二行包含 n 个整数,表示整个数列。

输出格式

输出一个整数,表示逆序对的个数。

数据范围

1 ≤ n ≤ 100000,
数列中的元素的取值范围 [1,1e9]。

解题思路:

        题目理解起来很容易,最经典的就是O(N*N)做法,只不过本题中数据范围100000,最大时间复杂度为O(n log n)。

        我们可以用上面讲的归并排序,第一步是将每个元素单独分成一个数组,右边的肯定要比左边的下标大,如果左边元素大于右边,即满足逆序对的条件,可以算出逆序对数量,再将所有逆序对的数量加起来即是结果。

代码实现:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int q[N];
int temp[N];
long long mergeSort(int q[],int l,int r)
{
    if(l>=r) return 0;
    int mid=(l+r)/2;

    long long ans=mergeSort(q,l,mid)+mergeSort(q,mid+1,r);
    int k=0;
    int i=l;
    int j=mid+1;
    while(i<=mid&&j<=r)
    {
        if(q[i]<=q[j])
        {
            temp[k++]=q[i++];
        }
        else{
            temp[k++]=q[j++];
            ans+=mid-i+1;
        }
    }
    while(i<=mid)
    {
        temp[k++]=q[i++];
    }
    while(j<=r)
    {
        temp[k++]=q[j++];
    }
    for(int a=l,b=0;a<=r;a++,b++)
    {
        q[a]=temp[b];
    }
    return ans;
}
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>q[i];
    }
   // mergeSort(q,0,n-1);
    /*for(int i=0;i<n;i++)
    {
        cout<<q[i]<<" ";
    }*/
    cout<<mergeSort(q,0,n-1)<<endl;
}

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

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

相关文章

Kubernetes(k8s)入门:核心组件详解

文章目录 写在前面一、ReplicationController(RC)1、官方解释2、举个例子3、小总结 二、ReplicaSet(RS)1、官方解释2、举个例子 三、Deployment&#xff08;用的最多&#xff09;1、官方解释2、举个例子&#xff08;1&#xff09;创建nginx_deployment.yaml文件&#xff08;2&a…

MySQL学习基础篇(七)---单行函数

MySQL学习基础篇(七)—单行函数 1 什么是函数 函数在计算机语言的使用中贯穿始终&#xff0c;函数的作用是什么呢&#xff1f;它可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既 提高了代码效率 &#xff0c;又 提高了可维护性 。在 SQL 中我们…

学习笔记整理-UML建模与应用复习4-构架建模

在一个更高的层次描述一个应用系统的结构&#xff0c;包括系统组件和组件之间的关系&#xff0c;组件的部署情况&#xff0c;以及硬件设备之间的关系。 1、组件图 用于描述功能所在的组件位置以及它们之间的关系。 包括&#xff1a;组件、接口、以及各种关系。可以显示…

IAR中Zstack协议栈相关问题解决办法

IAR中Zstack协议栈相关问题解决办法 1、Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. 如果遇到类似 Warning[w52]: More than one definition for the byte at address 0x4b in common segment INTVEC. It is defined i…

uniapp打包之配置MacOS虚拟机生成iOS打包证书

前言 uniapp是一款跨端开发框架,可用于快速开发iOS、Android、H5等多端应用。本文将详细介绍如何实现uniapp开发的iOS应用打包。 详细步骤 一、下载苹果原版镜像文件 点击此处下载 二、安装VMware uniapp打包iOS应用需要生成相应证书和P2文件&#xff0c;这些都需要用到I…

android ChkBugReport 的安装

参考地址: https://github.com/sonyxperiadev/ChkBugReport/wiki/How-to-install-it 1:先下载下来 git clone https://github.com/sonyxperiadev/ChkBugReport.git 然后在把这两个下载下来 http://sonyxperiadev.github.io/ChkBugReport/download/chkbugreport (Launcher sh…

前台-打印

插件 jsbarcode、uuid、vue-easy-print、vue-qr 主页面 <script setup lang"ts">import { ref } from vueimport PrintUser from ./printUser.vueconst easyPrint ref()const printDemo () > {setTimeout(() > {easyPrint.value.print()}, 1000)}…

kotlin constructor init companion object 与初始化by lazy

kotlin constructor init companion object 与初始化by lazy class MyDemo(private var v: Int) {init {println("init $v")}constructor(m: Int, n: Int) : this(m) {println("constructor $m $n")}//只初始化一次companion object {private var TAG &qu…

spring工程的启动流程?bean的生命周期?提供哪些扩展点?管理事务?解决循环依赖问题的?事务传播行为有哪些?

1.Spring工程的启动流程&#xff1a; Spring工程的启动流程主要包括以下几个步骤&#xff1a; 加载配置文件&#xff1a;Spring会读取配置文件&#xff08;如XML配置文件或注解配置&#xff09;来获取应用程序的配置信息。实例化并初始化IoC容器&#xff1a;Spring会创建并初…

台阶仪是干什么的?在太阳能光伏行业能测什么?

太阳能作为应用广、无排放、无噪声的环保能源&#xff0c;在近些年迎来快速发展&#xff0c;而在各类型的太阳能电池及太阳能充电系统中&#xff0c;多会镀一层透明的ITO导电薄膜&#xff0c;其镀膜厚度对电池片的导电性能有着非常重要的影响&#xff0c;因而需要对镀膜厚度进行…

IPETRONIK推出第三代测量模块,专为热管理、电动车测试打造

一 应用场景 车辆的热管理测试变得越来越重要&#xff0c;特别是在电动车领域&#xff0c;且精确的温度测量将给车辆的运行、性能以及乘客的舒适度带来直接影响。 • 热监测和验证&#xff1b; • 气候控制系统的功能测试&#xff1b; • 控制环路的监测&#xff1b; • 发…

Android CrashHandler全局异常

CrashHandler 介绍 Android 应用不可避免的会发生crash 即崩溃&#xff0c;无论程序写的多好&#xff0c;都会不可避免的发生崩溃&#xff0c;可能是由底层引起的&#xff0c;也有可能是写的代码引起的。当crash发生时&#xff0c;系统会kill掉正在执行的程序&#xff0c;现象…

CMake静态库动态库的构建和链接

cmake的基础知识&#xff1a;CMakeLists常用命令&#xff0c;在这里不再赘述。 Windows平台下可用cmake-gui生成vs的.sln工程&#xff0c;Linux平台下可以运行cmake命令。 动态库和静态库的构建 现有C工程目录结构如下&#xff1a; 静态库的构建 add.h #include <iost…

【kingbase数据库】kingbase查看所有表名

进入kingbase数据库&#xff0c;在数据库活动页面中选择要查询的数据库。 在SQL命令行工具中输入以下命令&#xff1a; SELECT relname FROM sys_class WHERE relkind r AND relnamespace (SELECT oid FROM sys_namespace WHERE nspname public);执行命令后&#xff0c;…

deeplabv3+源码之慢慢解析main.py(1)--get_argparser函数

deeplab v3源码 慢慢解析系列 本带着一些孩子们做&#xff0c;但本硕能独立看下来的学生不多。和孩子们一起再学一遍吧。希望孩子们和我自己都能坚持写下去吧。网上资料太多了&#xff0c;但不够慢&#xff0c;都是速成&#xff0c;没有足够的解释和补充&#xff0c;希望这次够…

EC200u-cn-4G模块连接OneNet上传GPS定位数据(MQTT协议)

一、前言 这篇文章介绍EC200U-CN 4G模块通过MQTT协议上传GPS数据到OneNet平台,完成地图数据显示的过程。 当前的主控芯片采用MC9S12XS128MAA,通过串口连接EC200U-CN实现联网功能,通过内置的MQTT协议指令,将采集的GPS数据上传到OneNet平台,联合百度地图实现位置显示。 下…

C#(四十七)之关于流的异常

一&#xff1a;Try-catch-finally 声明文件对象要在 Try-catch-finally 结构体外边声明 声明在try中的对象有作用域问题&#xff0c;其并不能影响finally中的程序 在catch中显示程序错误代码。 在finally中释放程序&#xff0c;关闭文件流。 二&#xff1a;using语句 1&a…

启动失败之JDK版本配置不一致

一、java: 警告: 源发行版 17 需要目标发行版 17 1.1.原因 :JDK 版本不对。 这里可以看到&#xff0c;项目需要的是JDK17&#xff0c;而我这里用的是JDK1.8。 1.2.修改 这里有两种操作&#xff0c;一种是修改项目版本&#xff0c;一种是修改JDK版本。无论是哪一种&#xff0…

NSS [SWPUCTF 2022 新生赛]xff

NSS [SWPUCTF 2022 新生赛]xff postman一把梭。

Mysql高级教程第二章

SQL Alias&#xff08;别名&#xff09; 通过使用 SQL&#xff0c;可以为列名称和表名称指定别名&#xff08;Alias&#xff09;。 SQL Alias 表的 SQL Alias 语法 SELECT column_name(s) FROM table_name AS alias_name 列的 SQL Alias 语法 SELECT column_name AS alia…