Confundido sobre la complejidad temporal de los bucles anidados y buscando consejos

Digamos que tengo dos códigos:

Código A:

for i = 0;
for j = 0;
while(i<n){       // O(n)
    while(j<n){   // O(n)
       printf("hello");
       .....

Tiempo de ejecución = o (n) x O (n) = O (n ^ 2) ..

Código B:

int result = 0;
int i = 0;
while (i < n/2){    //O(n)
result += arr[i];
i += 1;
    while(i >= n/2 && i < n){   //O(n)
        results += arr[i];
        i +=1;
        }

Tiempo de ejecución = O (n)

¿Cómo es que para el Código B NO MULTIPLICAMOS los dos O (n) para obtener O (n ^ 2) como lo hicimos para el Código A? Muy confundido acerca de cómo determinar los tiempos de ejecución.

Respuestas a la pregunta(1)

Su respuesta a la pregunta