Matemáticas detrás del método de la raíz cuadrada babilónica [cerrado]

Leí el método para calcular la raíz cuadrada de cualquier número y el algoritmo es el siguiente:

double findSquareRoot(int n) {
    double x = n;
    double y = 1;
    double e = 0.00001;
    while(x-y >= e) {
        x = (x+y)/2;
        y = n/x;
    }
    return x;
}

Mi pregunta con respecto a este método es

¿Cómo se calcula la raíz cuadrada? No entendí las matemáticas detrás de esto. Cómox=(x+y)/2 and y=n/x converge a la raíz cuadrada de n. Explica estas matemáticas.

¿Cuál es la complejidad de este algoritmo?