当前位置: 首页 > news >正文

用归并排序算法merge_sort( )求解 逆序对的数量 降低时间复杂度为 nlogn

题目简述
给定一个序列有n个数,求n个数中逆序对的个数,逆序对的定义:i < j && a[i] > a[j]。

输入格式

第一行包含一个整数n。

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

输出格式

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

输入样例:

6
2 3 4 5 6 1
输出样例:

5

归并排序应用
归并排序是将一个序列分成两个有序的序列,归并两个有序序列,归并后则该序列有序,是基于分治的思想。

根据逆序对的定义,我们也可以使用分治的算法来求解逆序对的数量。如图:

我们将序列分成两部分,我们发现逆序对的数量是三种逆序对数量的和:

左边序列的逆序对
右边序列的逆序对
横跨中间的逆序对

利用归并排序,我们可以分别求解左边序列的逆序对的数量和右边序列的逆序对的数量。如何求解横跨中间逆序对的数量呢?
归并排序中归并的过程:

意味着在归并两个序列的过程中,我们就可以计算出横跨中间的逆序对的数量。
时间复杂度O(nlogn),空间复杂度O(N)

//下面的代码是在归并排序的基础上做了改进,不同在于有返回值,递归终止条件,归并第二个序列。
int merge_sort(int a[], int l ,int r){//序列只有一个数if (l == r) return 0;//递归左边和右边int mid = l + r >> 1;int res = merge_sort(a, l , mid) + merge_sort(a, mid + 1, r);//归并的过程int i = l , j = mid + 1, k = 0;while (i <= mid && j <= r){if (a[i] <= a[j]) t[k++] = a[i++];else{t[k++] = a[j++];res += mid - i + 1;}}while (i <= mid) t[k++] = a[i++];while (j <= r) t[k++] = a[j++];//还原数组for (int i = 0 , j = l ; j <= r ; i ++ , j ++) a[j] = t[i];return res;
}


 

http://www.lryc.cn/news/232622.html

相关文章:

  • 大功率电源芯片WD5030L
  • Spring Boot使用EhCache完成一个缓存集群
  • yolov5模型代码怎么修改
  • VIM去掉utf-8 bom头
  • Go 使用Viper处理Go应用程序的配置
  • hadoop安装网址
  • JavaMail邮件发送服务
  • 【918.环形子数组的最大和】
  • Unity Quaternion接口API的常用方法解析_unity基础开发教程
  • Rust开发——使用rust实现Redis中hset
  • 海康Visionmaster-环境配置:VB.Net 二次开发环境配 置方法
  • 51单片机应用从零开始(四)
  • Django下的Race Condition漏洞
  • 【数据结构】希尔排序(最小增量排序)
  • Android Native崩溃信息分析和 工具(addr2line和ndkstack)使用
  • 2023年05月 Python(六级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • SQLite3 数据库学习(文章链接汇总)
  • 【VSCode】Visual Studio Code 下载与安装教程
  • 分布式教程从0到1【1】分布式基础
  • Ubuntu22.04 部署Mqtt服务器
  • HMM与LTP词性标注之LTP介绍
  • 基于SSM的学生疫情信息管理系统设计与实现
  • 分类预测 | Matlab实现PSO-GRU粒子群算法优化门控循环单元的数据多输入分类预测
  • 用电子签章软件怎么给标书一键签章的小故事
  • Windows10电脑没有微软商店的解决方法
  • SpringCloud-Gateway修改Response响应体,并解决大数据量返回不全等问题
  • Spark与SQL之间NB的转换_withClumn,split及SubString
  • 修改服务器端Apache默认根目录
  • 网络安全(大厂面试真题集)
  • 系列五、JVM的内存结构【PC寄存器】