\begin{algorithm} \caption{Count Inversions} \begin{algorithmic} \INPUT An array $A[1..n]$ representing a sequence of $n$ elements. \OUTPUT The number of inversions in $A$ . \STATE \COMMENT{return the number of inversions in $A[p..r]$ and merge sort $A[p..r]$ .} \PROCEDURE{MergeCount}{$A, p, r$} \IF{$p \ge r$} \RETURN $0$ \ENDIF \STATE $q = \lfloor(p + r)/2\rfloor$ \STATE $left =$ \CALL{MergeCount}{$A, p, q$} \STATE $right =$ \CALL{MergeCount}{$A, q + 1, r$} \STATE $cross =$ \CALL{Merge}{$A, p, q, r$} \RETURN $left + right + cross$ \ENDPROCEDURE \STATE \STATE \COMMENT{merge two subarrays and count the inversion across two subarrays} \PROCEDURE{Merge}{$A, p, q, r$} \STATE $n_1 = q - p + 1$ \STATE $n_2 = r - q$ \STATE Let $L[1..n_1 + 1]$ and $R[1..n_2 + 1]$ be two new arrays. \FOR{$i = 1$ \TO $n_1$} \STATE $L[i] = A[p + i - 1]$ \ENDFOR \FOR{$j = 1$ \TO $n_2$} \STATE $R[j] = A[q + j]$ \ENDFOR \STATE $L[n_1 + 1] = \infty$ \STATE $R[n_2 + 1] = \infty$ \STATE $i = 1$ \STATE $j = 1$ \STATE $count = 0$ \COMMENT{the number of inversions} \FOR{$k = p$ \TO $r$} \IF{$L[i] \le R[j]$} \STATE $A[k] = L[i]$ \STATE $i = i + 1$ \ELSE \STATE $count = count + n_1 - i + 1$ \STATE $A[k] = R[j]$ \STATE $j = j + 1$ \ENDIF \ENDFOR \RETURN $count$ \ENDPROCEDURE \STATE \STATE \CALL{MergeCount}{$A, 1, n$} \end{algorithmic} \end{algorithm}