2025-11-08 11:19:35
逆序数就是数组里前面数比后面数大的对数,比如数组[3,1,2]里3比1、2大,1比2小,总共有2个逆序对。快速求解要用分治法,分三步走:先分左右排序,再合并时数前面比后面大的次数,加起来得出结果。
分治法为什么能快速算逆序数呢?因为分治法在排序过程中天然遇到逆序对。比如数组[3,1,2]分治后变成[1,3]和[2],合并时3比2大,这时候发现1个逆序对。再分到更细的[3]和[1,2],合并时3比1、2大,又发现2个逆序对。总共3+2=5?不对啊,这里有个陷阱。其实正确做法是每次合并只算当前层逆序数,比如原数组分治到[3]和[1,2]时,合并时3和1、2形成2个逆序对,而1和2之间已经是有序的,所以总逆序数是2。再算更小的层,比如[1,3]和[2]合并时只有1个逆序对,所以总逆序数是1+2=3。这样分治法通过递归分解和合并统计,把时间复杂度从暴力法的O(n²)降到O(n log n)。根据数据统计,n=1万时暴力法需要1亿次操作,而分治法只需约10万次,效率提升100倍以上。
本题链接: