В основном я пытаюсь написать алгоритм в Java, чтобы определить количество пар в массиве, который вышел из строя. Поэтому, если мы берем i, а j и j находятся в более высоком положении в массиве, чем i, но A [i]> A [j], то он учитывает эти два числа как инверсию. В настоящее время это то, что у меня есть:Как найти количество инверсий в массиве?
for(int i = 0; i<n-1; i++){
if (A[i] > A[i+1]){
k++;
Что это делает только по сравнению с парами, которые находятся в непосредственной близости друг друга, так что теперь я пытаюсь изменить это, чтобы найти любые два числа в массиве, где нижняя позиция более высокое значение, чем число в более высоком положении. Я знаю, как это сделать, но я хочу, чтобы время выполнения было (n + k), где n - длина массива, а k - количество инверсий в массиве.
EDIT: Вот моя попытка осуществить вставки рода:
int k = 0;
int [] A = {5, 4, 3, 2, 1};
int n = A.length;
for(int i = 1; i < n; i++){
int temp = A[i];
int j;
for (j = i - 1; j >=0 && temp < A[j]; j--){
A[j + 1] = A[j];
A[j + 1] = A[j];
k++;
к, как предполагается, будет отслеживать, как много инверсий. Для массива 5, 4, 3, 2, 1 число, которое я получил, - 6. Правильно ли это?
Это, однако, не время работы O (n + k) при запросе OP, но O (n^2). Однако я не вижу другого способа реализовать это. ОП может просто быть не повезло. – markspace