逆序对计数问题是一个经典的算法问题,常见于计算机科学和数据结构领域。它的目标是计算数组中所有的逆序对的数量。逆序对是指数组中两个元素满足位置关系(i,j),且有

A[i]>A[j].

它的应用有:

排序算法分析:逆序对可以用来衡量一个数组的有序程度。一个数组的逆序对数越多,它就越无序。对逆序对的分析有助于理解和优化排序算法。

图像处理:在图像匹配和图像相似性计算中,逆序对可以用于比较像素或特征向量的顺序,帮助判断图像之间的相似度。

金融数据分析:在股票价格分析中,逆序对可以用来衡量价格序列的波动性和趋势。

基因排序:在生物信息学中,逆序对可以用于比较基因序列的相似性,帮助研究基因重组和进化过程。

暴力解法的时间复杂度是O(n2),而通过分治算法,时间复杂度可减少到O(nlogn).


#region 计数逆序对
public static (int, double[]) SortAndCountInv(double[] values)
{
if (values.Length <= 1)
{
return (0, values);
}
int halfSize = values.Length / 2;
double[] preValues = values.Take(halfSize).ToArray();
double[] afterValues = values.Skip(halfSize).Take(values.Length - halfSize).ToArray();
var preResult = SortAndCountInv(preValues);
var afterResult = SortAndCountInv(afterValues);
var splitResult = MergeAndCountSplitInv(preValues,afterValues);
return (preResult.Item1 + afterResult.Item1 + splitResult.Item1, splitResult.Item2);
}
private static (int, double[]) MergeAndCountSplitInv(double[] sortedPre, double[] sortedAfter)
{
double[] resultArray = new double[sortedPre.Length + sortedAfter.Length];
int i = 0, j = 0, resultInv = 0;
for(int k = 0; k < resultArray.Length; k++)
{
if (j == sortedAfter.Length)
{
resultArray[k] = sortedPre[i];
i++;
continue;
}
if (i == sortedPre.Length)
{
resultArray[k] = sortedAfter[j];
j++;
continue;
}
if (sortedPre[i] < sortedAfter[j])
{
resultArray[k] = sortedPre[i];
i++;
}
else
{
resultArray[k] = sortedAfter[j];
j++;
resultInv += sortedPre.Length - i; }
}
return (resultInv, resultArray); }
#endregion static void Main(string[] args)
{
double[] oriArray = new double[] {1,3,5,2,4,6 }; var result = AlgorithmMethod.SortAndCountInv(oriArray);
Console.WriteLine($"数组为{string.Join(",",oriArray)}");
Console.WriteLine($"逆序对数量是:{result.Item1}");
}

逆序对计数问题之C#实现(O(nlogn))的更多相关文章

  1. 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积

    出题:多人按照从低到高排成一个前后队列,如果前面的人比后面的高就认为是一个错误对: 例如:[176,178,180,170,171]中的错误对 为 <176,170>, <176,1 ...

  2. nlogn求逆序对&&陌上花开

    前置: nlogn逆序对: 前一个小时我还真的不会这个Orz 这里运用归并排序的思想. 对于一个序列,我们把它先分开,再合并成一个有序序列. 引自https://blog.csdn.net/qq_30 ...

  3. 逆序对 分治nlogn

    定义:A是包含n个元素的有序序列{a1,a2 … an},若ai > aj 且 i < j ,则称 (ai , aj)是A的一个逆序对.求逆序对是指求出A中存在逆序对的数量. 这个算法是归 ...

  4. LOJ6077「2017 山东一轮集训 Day7」逆序对 (生成函数+多项式exp?朴素DP!)

    题面 给定 n , k n,k n,k ,求长度为 n n n 逆序对个数为 k k k 的排列个数,对 1 e 9 + 7 \rm1e9+7 1e9+7 取模. 1 ≤ n , k ≤ 100   ...

  5. POJ2299Ultra-QuickSort(归并排序 + 树状数组求逆序对)

    树状数组求逆序对   转载http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 转载: 树状数组,具体的说是 离散化+树 ...

  6. Summary: Merge Sort of Array && 求逆序对

    常用算法(后面有inplace版本): package ArrayMergeSort; import java.util.Arrays; public class Solution { public ...

  7. (剑指Offer)面试题36:数组中的逆序对

    题目: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 思路: 1.顺序扫描 顺序扫描整个数组,每扫描到一个数字,就将该数 ...

  8. [jobdu]数组中的逆序对

    http://ac.jobdu.com/problem.php?pid=1348 数组中的逆序对也是个常见的题目,算法导论中也有一些描述,参考:http://www.cnblogs.com/wuyue ...

  9. 【Bzoj 3295】 动态逆序对(树套树|CDQ分治)

    [题意] 每次删除一个数,然后问删除前逆序对数. [分析] 没有AC不开心.. 我的树状数组套字母树,应该是爆空间的,空间复杂度O(nlogn^2)啊..哭.. 然后就没有然后了,别人家的树套树是树状 ...

  10. hdu_5193_Go to movies Ⅱ(带插入删除的逆序对,块状链表)

    题目链接:hdu_5193_Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi.每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi> ...

随机推荐

  1. MySQL数据库datetime类型不能为空值的问题

    修改mysql的配置文件:my.ini 将其只的: sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUT ...

  2. Navicat 数据库如何再次打开恢复上次的页面

    选项->选项卡->从上次离开的画面继续 2.其他软件有这个需求也可以在设置里找一找!

  3. Vulnhub-venom

    对于该靶机,注意利用了信息收集来的21端口和80端口,网站源码发现账户,ftp匿名登录密码猜测,维吉尼亚解密,后台管理员登录,CVE文件上传RCE漏洞利用反弹shell,提权有两中,利用版本内核提权和 ...

  4. 扩展知识:vscode配置easyx

    扩展知识:vscode配置easyx 前言 ‍ 因为个人用习惯了vscode,对于visual studio的操作只能说相当程度上很不适应,因此,我打算经历一番配置,让vscode可以配置上easyx ...

  5. Netty基础—8.Netty实现私有协议栈

    大纲 1.私有协议介绍 2.私有协议的通信模型 3.私有协议栈的消息定义 4.私有协议栈链路的建立 5.私有协议栈链路的关闭 6.私有协议栈的心跳机制 7.私有协议栈的重连机制 8.私有协议栈的重复登 ...

  6. 带有可旋转摄像头的移动小车(urdf+rviz)

    博客地址:https://www.cnblogs.com/zylyehuo/ 成果图 step1:新建工作空间 mkdir -p catkin_ws/src cd catkin_ws catkin_m ...

  7. CentOS7图形化界面和命令行界面之间的转换

    最近在学习Lunix操作系统下的CentOS7系统,参考了网页上大多数的资料并进行在自己的亲身实践,最终想要记录一下我在CentOS7系统中有关命令行和图形化界面之间的转换.1.查看当前的默认界面形式 ...

  8. 基于.NetCore开发 StarBlog 番外篇 (1) StarBlog Publisher,跨平台一键发布,DeepSeek加持的文章创作神器

    前言 我一直在优化发布文章的工作流 之前的 StarBlog 已经支持文章打包上传(将 Markdown 和图片文件一并打包为 ZIP 格式上传),但还是有不少步骤,重复的次数多了,还是感觉麻烦. 为 ...

  9. MySQL查询当前连接数的语句

    1. 查看当前总连接数 SHOW STATUS LIKE 'Threads_connected'; 返回当前建立的连接总数 2. 查看最大连接数配置 SHOW VARIABLES LIKE 'max_ ...

  10. 继承的介绍、使用-java se进阶 day01

    1.继承的介绍 2.继承的使用 为什么要使用继承?假如以后要写一个项目,其中程序员一个类,项目经理一个类,Hr一个类,但是这些类的成员都一样 如图 我们会发现这些成员都是重复的,三个类都写重复的成员十 ...