计算涉及大于一定值的元素之间的交换的求反

时间:2019-03-03 08:43:56

标签: sorting

这是一个作业问题,我花了很多时间思考。

假设我有一个未排序的整数数组和一个给定的整数d。任务是计算涉及交换的大于d的反转次数。

例如,给定一个输入数组(3,4,3,1)且d = 2,由于仅计算了4和1之间的求反,所以​​这种求反的数量为1。其他反演的差异小于2。

当然,计算反转次数的一种简单方法是遍历列表中的每个数字,并在该数字之前添加元素数量,该数量较小且相差大于d。但是,这是一个n ^ 2算法。而是需要一个n \ log n算法。

此处提供了另一个更有效的算法,其中我们对输入数组执行mergesort并从那里直接计数。 https://www.geeksforgeeks.org/counting-inversions-subarrays-given-size/

但是,我在修改它以获得正确答案时遇到了麻烦。

我的方法是这样的:

在mergesort的“合并”步骤中,如果左侧子数组的第一项较小,则只需将其添加到已排序的数组中,然后继续即可。

否则,我将所需的求逆数增加,使左子数组中的项数比右子数组中的第一项大d。

尽管如此,我仍然很难获得正确的答案。

有人可以帮我吗?谢谢。

1 个答案:

答案 0 :(得分:0)

在合并过程中,如果左子数组A [i]的索引i的元素大于右子数组A [j]的索引j的元素,则将存在j-i交换。

执行二进制搜索以查找最小元素,该元素的差异大于A [i ... j-1]子数组上的值。那么大于该值的元素之间的交换次数将是j减去此最小元素的索引。