Salve non riesco a capire come funzioni questo algoritmo di ordinamento.
Prendo un compito del docente e provo a spiegarlo ma non riesco a capire alcuni passaggi.
struct Articolo
{ char categoria;
char nome[MAXL];
float costo;
int numConf;
};
struct ScorteMagazzino {
Articolo scorte[MAXNUM];
int numAr;
};



La prima domanda mi dice di ordinare gli articoli per valori alfabeticamente crescenti della categoria, e se hanno lo stesso valore li devo ordinare per valori del nome alfabeticamente crescenti.
Ecco la risposta del docente ma che non riesco a capire

void scambia(Articolo a[],int x,int y)
{ Articolo temp=a[x]; a[x]=a[y]; a[y]=temp;}

void ordina(ScorteMagazzino* s)
{ int ordinato=0; for(int i=0;i<s->numAr-1 && !ordinato;i++)
{ ordinato=1;

for(int j=s->numAr-1;j>=i+1;j--)

if((s->scorte[j].categoria<s->scorte[j-1].categoria)||
(s->scorte[j].categoria==s->scorte[j-1].categoria && strcmp(s->scorte[j].nome,s->scorte[j-1].nome)<0))
{
scambia(s->scorte,j,j-1);

ordinato=0;
}
}
}





Non riesco a capire tre passaggi:
1) il perché
della prima funzione ordina. Come vengono interpretati quegli array
2) quell'int ordinato all'inizio della funzione void . Perché lo dichiaro a 0 e poi gli do uno se risulta essere minore un articolo?
3) ma credo sia dovuta alla 1, la funzione scambia finale, anche qui non capisco come vengano elaborate j e j-1.


Grazie per le risposte.