У меня есть следующие:Временная сложность алгоритма с рекурсией
public static int[] MyAlgorithm(int[] A, int n) {
boolean done = true;
int j = 0;
while(j <= n - 2) {
if(A[j] > A[j+1]) {
int temp = A[j + 1];
A[j + 1] = A[j];
A[j] = temp;
done = false;
}
j++;
}
j = n - 1;
while(j >= 1) {
if(A[j] < A[j-1]) {
int temp = A[j - 1];
A[j - 1] = A[j];
A[j] = temp;
done = false;
}
j--;
}
if(!done)
return MyAlgorithm(A, n);
else
return A;
}
Это существенно сортирует массив «A» длины «N». Однако, пытаясь разобраться, какая временная сложность этого алгоритма, я продолжаю сталкиваться с кругами. Если я посмотрю на первый цикл while, содержимое в цикле получит выполнение «n-2» раз, что сделает его O (n). Второй цикл while выполняется в «n-1» раз, что делает его O (n), если мы отбросили константы для обеих функций. Теперь рекурсивная часть этого алгоритма снова отбрасывает меня.
Рекурсия выглядит хвостовой рекурсивной, учитывая, что после этого она не вызывает ничего. На данный момент я не уверен, что рекурсия, являющаяся хвостовой рекурсией, имеет какое-то отношение к этой временной сложности ... Если это действительно O (n), это обязательно означает, что это также Omega (n)?
Пожалуйста, исправьте любые мои предположения, которые я сделал, если они есть. Любые подсказки были бы замечательными!
Ваш код * выглядит * неправильным, так как рекурсия всегда использует те же значения все время ... Я ожидал бы, что один или два элемента попадут туда, где этот код и диапазон в рекурсии будут меньше (до конца с O (n^2)) –