Tens uma forma relativamente simples de ver as complexidades.
ciclos (for; while; etc) são de complexidade n, todas as outras operações são de complexidade 1, logo desprezáveis.
ciclos dentro de ciclos equivale a ao produto da complexidade dos mesmos, eg. O(n) * O(n).
ciclos não contidos são do tipo O(n) + O(n) = 2 O(n) = O(n).
No entanto é bom que percebas ou decores algumas operações/algoritmos com complexidades especiais (pesquisas em árvores, os *sort, etc).
Isso é uma forma demasiado simplista de ver as coisas, e que não se aplica a todos os casos...
-------------------------
Considerando S(i=0,n,i) como sendo o somatório para i de 0 até i, deduzi o seguinte (ignorando as constantes nas partes onde há blocos de complexidade maior, e considerando constantes equivalentes a 1):
S(i=0, n-1, S(j=i, n-1, S(k=i, j-1, 1) ) )
<=> S(i=0, n-1, S(j=i, n-1, j-i ) )
<=> S(i=0, n-1, (n - i) (n - i - 1) / 2 )
<=> S(i=0, n-1, i (i+1) / 2)
<=> S(i=0, n-1, (i^2 + i) / 2)
<=> 1/2 ( S(i=0, n-1, i^2) + S(i=0, n-1, i) )
que tem complexidade igual a:
S(i=0,n-1,i^2)
Ora isto não me parece O(n^2).
Conseguimos sempre ter um valor de n para o qual S(i=0, n-1, i^2) > M * n^2