逆序对是满足 i
统计 PHP 数组中的逆序对数量,本质是找出所有满足 i $arr[j] 的索引对 (i, j)。这个问题不能靠简单双重循环暴力解决(时间复杂度 O(n²),大数据下超时),推荐用归并排序思想在线性对数时间内完成(O(n log n))。
什么是逆序对?
逆序对不是指数组倒序,而是指“顺序错位”的元素对:前面的数比后面的数大,且它们在原数组中位置靠前。例如:
- [2, 4, 1, 3] 中,(2,1)、(4,1)、(4,3) 是逆序对 → 共 3 个;
- [5, 4, 3, 2, 1] 是完全逆序,逆序对数为 C(5,2) = 10;
- [1, 2, 3, 4] 是升序,逆序对数为 0。
用归并排序法高效统计(推荐)
归并排序在合并两个有序子数组时,能自然捕获跨子数组的逆序关系:当左半部分的某个元素 大于 右半部分当前元素,说明它和右半部分从当前起的所有元素都构成逆序对。
PHP 实现要点:
立即学习“PHP免费学习笔记(深入)”;
- 递归分割数组至单元素;
- 合并时,若
$left[$i] > $right[$j],则贡献count($left) - $i个逆序对;- 需在每次合并中累加计数,并返回排序后的子数组供上层使用。
简易可运行示例代码
以下是一个完整、无依赖的 PHP 函数:
function countInversions($arr) { if (count($arr) <= 1) return 0; <pre class="brush:php;toolbar:false;">$mid = (int)(count($arr) / 2); $left = array_slice($arr, 0, $mid); $right = array_slice($arr, $mid); $inv = countInversions($left) + countInversions($right); // 合并并统计跨区间逆序对 $i = $j = $k = 0; $merged = []; while ($i < count($left) && $j < count($right)) { if ($left[$i] <= $right[$j]) { $merged[$k++] = $left[$i++]; } else { $merged[$k++] = $right[$j++]; $inv += count($left) - $i; // 关键:左半剩余全部 > 当前右元 } } while ($i < count($left)) $merged[$k++] = $left[$i++]; while ($j < count($right)) $merged[$k++] = $right[$j++]; return $inv;}
// 测试 echo countInversions([2, 4, 1, 3]); // 输出:3
注意事项与边界情况
实际使用时注意:
- 数组含重复元素(如 [2, 2, 1])时,定义是否将
>改为>=—— 通常逆序对定义为严格大于,重复不计入;- 大数组慎用递归,PHP 默认栈深度有限,可改写为迭代归并(稍复杂但更健壮);
- 若只需判断是否存在逆序对(而非总数),一次遍历记录最小后缀即可,O(n) 时间;
- 索引从 0 开始,无需额外偏移处理。
相关文章
Composer怎么校验多语言包中的配置数据
FrankenPHP容器端口怎么只绑定本机地址
FrankenPHP调用unset后内存不降怎么解释
Composer更新运行超时怎么解决
PHP8.2百题:PHP实现基数排序算法完整代码
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门AI工具
相关专题
打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。
10524
2023.09.01
取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。
6181
2023.10.11
php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。
2115
2023.10.11
连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。
3888
2023.10.23
php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。
4594
2023.10.23
PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。
5157
2023.11.09
php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。
4042
2023.11.13
本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。
60
2026.10.10
热门下载
相关下载
精品课程
最新文章












