Ви можете просто порахувати кількість перетворень у списку.
Інверсія
Інверсія в послідовність елементів типу T- це пара елементів послідовності, які виходять з ладу згідно з деяким упорядкуванням <на множині Ts.
З Вікіпедії :
Формально, нехай це A(1), A(2), ..., A(n)буде послідовність nчисел.
Якщо i < jі A(i) > A(j), то пара (i,j)називається інверсією з A.
Інверсії номер послідовності одна загальна міра його або порівняння .
Формально число інверсії визначається як кількість інверсій, тобто

Щоб зробити ці визначення більш зрозумілими, розглянемо приклад послідовності 9, 5, 7, 6. Ця послідовність має інверсії (0,1), (0,2), (0,3), (2,3) та номер інверсії 4 .
Якщо потрібно значення між 0і 1, ви можете розділити число інверсії на N choose 2.
Для того, щоб створити алгоритм для обчислення цього бала для сортування списку, у вас є два підходи:
Підхід 1 (детермінований)
Змініть свій улюблений алгоритм сортування, щоб відстежувати, скільки інверсій він виправляє під час його запуску. Хоча це нетривіально і має різні реалізації в залежності від вибраного алгоритму сортування, ви отримаєте алгоритм, який не є дорожчим (за складністю), ніж алгоритм сортування, з якого ви почали.
Якщо ви їдете цим маршрутом, пам’ятайте, що це не так просто, як підрахунок «свопів». Наприклад, Mergesort - це найгірший випадок O(N log N), але якщо він ведеться за списком, відсортованим у порядку зменшення, він виправить усі N choose 2інверсії. Це O(N^2)виправлення, виправлені в O(N log N)операціях. Тому деякі операції неминуче повинні виправляти більше однієї інверсії одночасно. Ви повинні бути обережними у своїй реалізації. Зауважте: ви можете зробити це O(N log N)складно, це просто хитро.
Пов'язане: обчислення кількості "інверсій" у перестановці
Підхід 2 (стохастичний)
- Випадково вибіркові пари
(i,j), деi != j
- Для кожної пари визначте, чи
list[min(i,j)] < list[max(i,j)](0 або 1)
- Обчисліть середнє значення цих порівнянь, а потім нормалізуйте
N choose 2
Я особисто пішов би зі стохастичним підходом, якщо у вас немає вимоги точності - хоча б тому, що це так просто здійснити.
Якщо ви дійсно хочете - це значення ( z') між -1(відсортовано за спаданням) до 1(відсортовано за зростанням), ви можете просто зіставити значення вище ( z), яке знаходиться між 0(сортування за зростанням) та 1(відсортоване за спаданням), до цього діапазону, використовуючи цю формулу :
z' = -2 * z + 1