ok, cred ca ti-am gasit problema
nu ar trebui sa fie:
int i = st + 1, j = dr - 1; ??
Exista cazul cand do { i++;} while (...) o sa iti creasca i cu o unitate si o sa devina i == st. (j nu conteaza ce e)
Tu o sa inlocuiesti a[ i ] cu a[j] (sau mai bine zis a[st] cu a[j]).. si uite asa a[st] nu mai este ce era la inceput. In momentul cand scrii pivot2 = a[st].y, tu tii minte valoarea respectiva. Pe parcurs intradevar, o sa se schimbe a[st] cu un a[j], dar tu o sa compari in continuare dupa pivot2!
Qsort merge bine daca folosesti pivot2 ca o sa obtii o partitionare dupa o valoare fixa. Daca nu folosesti pivot2, acea valoare din a[st] (mai exact a[st].y) o sa se schime si o sa shimbi elementul dupa care faci partitionarea.
Sper ca te-am lamurit