What is the algorithm for generating a Ripple address from a ecdsa public key?
The process of going from a Ripple secret to a specific ECDSA private/public key (which you didn't ask about but I included it here anyway) is documented on the Account Family wiki page.

From a ECDSA public key, {X,Y}, you do ripemd160(sha256(CompressPoint(X,Y)).
That's then encoded in base58 (using the Ripple alphabet/dictionary).

You can also look at the rippled implementation or a Go implementation.