Quello che fa è:
- Trascina l' elemento massimo dell' array [0....k] in posizione k;
- Decrementa k.

Quindi se hai l' array {10,4 7,2 1} dopo la prima iterazione del for esterno in v[4] c'è 10, e k viene decrementato perchè non c'è bisogno di riconsiderare l' elemento 4,dato che è il massimo.
Se k partiva da 0 e arrivava fino a n-1 non va bene perchè il ciclo interno verrebbe eseguito prima su un singolo elemento, poi su 2, poi su 3 .... e non avrebbe l' effetto di ordinare completamente l' array,non ne sono sicuro ma penso che alla fine del ciclo avresti {4,2,7,10,1}.
Per farlo funzionare dovresti modificare anche il for interno:
codice:
for (int k=1; k<=n-1; k++)
    for (int i=n-1; i>=k; i--)
        if (v[i] < v[i-1])
            swap(v[i],v[i+1]);
Il risultato sarebbe identico, ha cioè l' effetto di ordinare l' array, ma in modo diverso.
Invece di trascinare gli elementi più grandi nelle ultime posizioni del vettore, trascina gli elementi più piccoli nelle posizioni iniziali del vettore.