数组中的反转,我怎么了?请查看下面的数学/伪代码

时间:2018-07-21 00:21:42

标签: arrays algorithm sorting recursion mergesort

我一直在尝试为反转次数编写一个伪代码。

在此示例中,我们将数组称为长度为n的mainArray。并且还假设n是一个偶数整数。

据我了解,i<j, mainArray[i] > mainArray[j]时需要对数组求反。然后,我们交换位置以对其进行排序。

使用合并排序算法,一旦达到基本情况并开始合并两个半部分(左半部分和右半部分),代码将如下所示

let i = 0, j=0, k=0, inversions = 0
for k in range(0,n-1) 
    if left-half[i] < right-half[j]
       mainArray[k] = left-half[i]
       i+=1
    else
       mainArray[k] = right-half[j]
       j+=1

       //now at this point an inversion has occurred
       //so from my understanding at this point there was only 1 swap? because the program 
       //skipped left-half[i] and proceeded to right-half[j]
       // so my answer was **"Inversions = Inversions + 1"** incrementing by 1 Inversions wherever the **Else-Block is run**. 


       //but in the solution the correct answer is 
       Inversions = Inversions + {(n/2)-i}

我没有得到这个部分? 为什么要假设右半[j]与数组左半部分的所有其余元素交换位置。我在这里缺少什么关键点?

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:2)

回想一下left-halfright-half已排序,因此如果i<j, left-half[i] > right-half[j]也暗示left-half[i+1..n/2] > right[j]。因此,我们计算Inversions + {(n/2)-i}来计算所有个反演,而不仅仅是一个。