PDA

View Full Version : [C] help su algoritmi stabili di ordinamento


PaSteam
16-05-2008, 09:36
salve

avendo una struttura del genere

struct alunno {

char cognome[20];
int voto;
};

come dovrei realizzare un algoritmo di ordinamento stabile che ottenga
partendo da

rossi 6
verdi 6
leopardi 6
foscolo 7
bianchi 7
napoleone 5

ottenga

ordinando per voto (in maniera che risultino ordinati anche i cognomi e non solo i voti )

napoleone 5
leopardi 6
rossi 6
verdi 6
bianchi 7
foscolo 7

e lo stesso ordinando per nome

tutti gli esempi di algoritmi di ordinamento che ho trovato hanno esempi solo
per array con un solo valore non per strutture quindi con pił valori da ordinare

gugoXX
16-05-2008, 11:11
Ciao. Una nota, non stai cercando un algoritmo stabile di ordinamento.
Un algoritmo di ordinamento ha come input un criterio di ordinamento, che ritorna una relazione d'ordine (maggiore, minore, uguale) tra 2 elementi.
Tipicamente una funzione che restituisce quindi rispettivamente un valore >0, <0 oppure 0.
Quando ci sono piu' elementi che restituiscono "UGUALE", allora un algoritmo stabile prevede che gli elementi "uguali" vengano restituti nell'ordine originale della lista di partenza.
Un algoritmo instabile (ES: qsort) puo' restituire gli elementi "uguali" in ordine casuale.

Ordinando per voto con algoritmo stabile, tu avresti ottenuto
foscolo 7
bianchi 7
rossi 6
verdi 6
leopardi 6
napoleone 5


Quello che stai cercando e' invece un algoritmo di ordinamento normale, con una chiave doppia invece che singola.
E' sufficiente scrivere la funzione che restituisce la relazione d'ordine che faccia uso di entrambi i campi.

qualcosa tipo

int ret;
ret=voto1- voto2;
if (ret==0) ret=CompareTo(nome1, nome2);
return ret;


Fra l'altro, l'algoritmo di ordinamento ORDER BY dei Database commerciali e' instabile...