Una certa pratica sull'argomento l'ho fatta in GVbasic, in TurboC e anche in VB6.

Public Sub OrdinaClassifica()
Dim ii As Integer
Dim Lavora As Boolean
Dim ConcX() As Struct ' array-copia delle strutture originali
Dim conc1 As Struct ' struttura copia-contenitore temporaneo

ReDim CONCbis(IntMaxInd)
ReDim ConcX(IntMaxInd)

For ii = 0 To IntMaxInd - 1
ConcX(ii) = CONC(ii) ' copia l'array pubblico in quello locale
Next ii

Do ' routine ordina strutture
Lavora = False
For ii = 0 To IntMaxInd - 1 ' scandisce le strutture originali
If ii + 1 <= IntMaxInd - 1 Then
' 1a chiave discriminante: _________ ordina per PUNTEGGIO ottenuto _____
If ConcX(ii).Punti(ITrn) < ConcX(ii + 1).Punti(ITrn) Then
conc1 = ConcX(ii)
ConcX(ii) = ConcX(ii + 1)
ConcX(ii + 1) = conc1
Lavora = True
End If
' 2a chiave discriminante: ___________ ordina per punteggio ELO ________
If ConcX(ii).Punti(ITrn) = ConcX(ii + 1).Punti(ITrn) And _
ConcX(ii).ELO < ConcX(ii + 1).ELO Then ' se il giocatore PIU' IN ALTO
conc1 = ConcX(ii) ' ha un ELO più basso di chi lo segue . . .
ConcX(ii) = ConcX(ii + 1) ' . . . c'è lo scambio di posizione
ConcX(ii + 1) = conc1
Lavora = True
End If
' 3a chiave discriminante: _____________ ordina per CATEGORIA __________
If ConcX(ii).Punti(ITrn) = ConcX(ii + 1).Punti(ITrn) And _
ConcX(ii).ELO = ConcX(ii + 1).ELO Then
'Lavora = True
End If
' 4a chiave discriminante: __________ mette in ordine ALFABETICO _______
If ConcX(ii).Punti(ITrn) = ConcX(ii + 1).Punti(ITrn) And _
ConcX(ii).ELO = ConcX(ii + 1).ELO Then
If ConcX(ii).Cognome = ConcX(ii + 1).Cognome Then
' se i cognomi sono uguali ordina i nomi
If ConcX(ii).Nome > ConcX(ii + 1).Nome Then
conc1 = ConcX(ii)
ConcX(ii) = ConcX(ii + 1)
ConcX(ii + 1) = conc1
Lavora = True
End If
Else ' altrimenti ordina i cognomi
If ConcX(ii).Cognome > ConcX(ii + 1).Cognome Then
conc1 = ConcX(ii)
ConcX(ii) = ConcX(ii + 1)
ConcX(ii + 1) = conc1
Lavora = True
End If
End If
End If
End If
Next ii
Loop While Lavora = True ' fine routine ordina strutture

If Inizio = True Then
Inizio = False
If TorneoSvizzero.Value = True Then '________ solo nel sistema svizzero
For ii = 0 To IntMaxInd - 1
CONC(ii) = ConcX(ii) '____________ funziona da sorteggio al 1° turno
Next ii
End If
End If

For ii = 0 To IntMaxInd - 1
CONCbis(ii) = ConcX(ii) '__________________ per il tabellone-classifica
Next ii
End Sub

Naturalmente questa ruotine ti potrà servire solo come esempio.
L'ho estratta da un programma che devo ancora finire.
Se hai domande sono a disposizione ciao. emarvin36