使用merge-sort计算反转

时间:2011-08-03 15:15:29

标签: algorithm

我正在阅读“算法介绍,第2版”。它有一个练习,问题2.4

  

设A [1 n]是n个不同数字的数组。如果我< j和A [i]> A [j],则对(i,j)称为A的反转。

     

d。给出一种算法,该算法确定Θ(n lg n)最坏情况时间内n个元素上任何排列的反转次数。 (提示:修改合并排序。)

然后我在教师手册中找到了这个解决方案

COUNT-INVERSIONS ( A, p, r)
inversions ← 0
if p < r
  then q ← ( p + r)/2
   inversions ← inversions +C OUNT-I NVERSIONS ( A, p, q)
   inversions ← inversions +C OUNT-I NVERSIONS ( A, q + 1, r)
   inversions ← inversions +M ERGE -I NVERSIONS ( A, p, q, r)
return inversions


MERGE -INVERSIONS ( A, p, q, r)
n1 ← q − p + 1
n2 ← r − q
create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]
for i ← 1 to n1
  do L[i] ← A[ p + i − 1]
for j ← 1 to n2
  do R[ j ] ← A[q + j ]
L[n 1 + 1] ← ∞
R[n 2 + 1] ← ∞
i ←1
j ←1
inversions ← 0
counted ← FALSE
for k ← p to r
  do 
  if counted = FALSE and R[ j ] < L[i]
    then inversions ← inversions +n1 − i + 1
    counted ← TRUE
  if L[i] ≤ R[ j ]
    then A[k] ← L[i]
    i ←i +1
  else A[k] ← R[ j ]
    j ← j +1
    counted ← FALSE
  return inversions

我的问题是,我发现变量计数真的没用。在第一个if子句中,它可能设置为 TRUE ,但这意味着R [J]&lt; L [i],所以在最后一个else子句中,它将被设置回 FALSE

有人能给我一个例子来解释为什么需要计算吗?

1 个答案:

答案 0 :(得分:2)

你是对的,counted变量是无用的,因为它在测试时总是错误的。

看起来作者的目的是避免两次计算相同的R[j]元素。但他们没有注意到,在计算R[j]后,由于进入j条款,else将始终递增,因此不需要采取预防措施。