\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}