Pero:
- Si encuentro un i > 0 en la primera mitad deberia buscar en la segunda. (podria existir un i mayor)
- Si no encuentro un i > 0 en la segunda mitad debería buscar en la primera si no lo hice antes. (ya que podria existir un i > 0)
Código
/* A[1..n] esta ordenado de menor a mayor * Devuelve el mayor indice i' menor o igual a i tal que A[i'] <= c * o cero si no se encuentra. Cota superior asintotica: O(n) */ void buscarIndice(const uint* A, uint &i, const uint c) { while (i > 0 && A[i] > c) i--; }
El siguente codigo es O(n^2), lo que si es seguro es que como A está ordenado es posible implementarlo en O(n log n) (La demostración queda a cargo del lector) ¿Alguna idea de por donde empezar?
Código
for (uint j = 1; j <= n; j++) { uint i = j; // No es ortodoxo modificar j buscarIndice(A, i, c); hacerAlgoUtilCon(i); }