Возможный дубликат:
Подсчет инверсий в массиве
Это вопрос о телефонном интервью: "Найдите количество инверсий в массиве". Я предполагаю, что они означают решение O (Nlog N). Я считаю, что это не может быть лучше, чем O (Nlog N), поскольку это сложность сортировки.
Ответы на аналогичный вопрос можно резюмировать следующим образом:
- Рассчитайте половину расстояния, на которое элементы должны быть перемещены для сортировки массива: скопируйте массив и отсортируйте копию. Для каждого элемента исходного массива
a[i]
найдите его позициюj
в отсортированной копии (двоичный поиск) и суммируйте половинки расстоянийabs(i - j)/2
. -
Изменить
merge sort
: изменитьmerge
, чтобы подсчитать инверсии между двумя отсортированными массивами и запустить регулярныйmerge sort
с помощью этого измененногоmerge
.Имеет ли смысл? Существуют ли другие (возможно, более простые) решения? Не слишком ли сложно провести собеседование с телефоном?