Parece mejor hacer una funcion que compare y solo 1 intercambio, algo asi como:
Código
Sugiero corregir la funcion de ordenamiento que al parecer le falta un ciclo al interior del que ya esta, sino no va a ordenar completamente el arreglo.
if( mayor( student1, student2 ) ) { // intercambiar }
Exacto con una función puedes modularizar el programa para no hacerlo como lo he hecho en el código de ejemplo, claro que yo lo había hecho para dar la idea de como ordenar por eso no he creado una función auxiliar.
Y a qué te refieres con que le falta un ciclo? No lo veo.