Для подсчёта количества инверсий в последовательности за линейное время можно использовать карманную сортировку. 1 Для этого нужно определить карман, в который попадёт текущий элемент, затем найти число элементов в старших карманах относительно этого кармана и аккуратно подсчитать количество элементов, больших текущего в этом кармане. 1
Также для решения задачи за время O(nlogn) можно применить алгоритм «разделяй и властвуй». 5 Для этого нужно разделить вводный массив на две половины и сделать рекурсивный вызов обоих из них. 5 Если обе части уже отсортированы, количество инверсий из элементов разных половин можно вычислить за время O(n). 5
Ещё один алгоритм, который работает за время O(nlogn), можно построить с помощью дерева отрезков. 1