如何查找数组中的反转次数?

Mic*_*ael 18 arrays sorting algorithm

可能重复:
计算数组中的反转

这是一个电话采访问题:"查找数组中的反转次数".我猜他们的意思是O(N log N)解决方案.我认为它不能比O(N log N)更好,因为这是排序的复杂性.

类似问题的答案可归纳如下:

  1. 计算元素移动距离的一半以对数组进行排序:复制数组并对副本进行排序.对于原始数组的每个元素,a[i]找到它j在排序副本(二进制搜索)中的位置,并将距离的一半加起来abs(i - j)/2.
  2. 修改merge sort:修改merge以计算两个已排序数组之间的反转,并merge sort使用修改后的数组运行merge.

    是否有意义 ?还有其他(可能更简单)的解决方案吗?电话采访难道不是很难吗?

Zel*_*luX 21

它实际上是分而治之算法的应用,如果您熟悉它,您可以快速提出解决方案.

以[1 3 8 5 7 2 4 6]为例,假设我们已将数组排序为[1 3 5 8]和[2 4 6 7],现在我们需要将两个数组合并得到总数倒置.

由于我们已经在每个子数组中有多个反转,我们只需要找出由数组合并引起的反转次数.每次插入一个元素,例如插入[1#3 5 8]时,您就可以知道第一个数组和元素2之间存在多少个反转(本例中为3对).然后你可以添加它们以获得合并引起的反转次数.