Newsgroup: it.comp.lang.c
Titolo: Algoritmo per ordinare 3 numeri

Salve a tutti!
Ho bisogno di un algoritmo rapido per l'ordinamento di 3 numeri.
Mi serve per la programmazione di una funzione per il disegno di un poligono
con 3 vertici che dovrebbe prima ordinare i punti (o meglio i puntatori alle
coordinate dei punti) rispetto alla coordinata y quindi iniziare la
procedura di calcolo dei lati.
L'algoritmo funziona ma la procedura che ho inserito per l'ordinamento non
sempre funziona. Quando funziona però il disegno viene fatto correttamente.
Grazie.
Lorenzo, 
gu...@ba.dada.it

...

La funzione che cerchi si chiama qsort (devi includere stdlib.h)
Ciao Luciano

sempre funziona. Quando funziona però il disegno viene fatto correttamente.
In questo caso, non ti conviene sicuramente utilizzare i sort
esistenti, come qsort, ottimizzati per sortare numeri di elementi
ben maggiori di 3; studia bene come ti convenga fornire i dati
in input all'algoritmo, e come ne desideri i dati in output (rischi
di spendere piu` istruzioni-macchina per copiarli avanti e
indietro che per sortarli, sarebbe assurdo!) e poi implementa
(fondilo inlinea col resto del tuo codice, inutile pagare il tempo
di chiamata a funzione per una cosa che usi da un solo punto!)
quello che, come funzione separata e con una certa scelta di
argomenti di I/O, si presenterebbe un po' come:
void sort3(int a, int b, int c, int* ilmax, int* ilmed, int* ilmin)
{
    if(a>b) {
        if(a>c) {    // a>c && a>b
            *ilmax = a;
            if(b>c) {
                *ilmed = b; *ilmin = c;
            } else {
                *ilmed = c; *ilmin = b;
            }
        } else {    // c >= a e a>b quindi:
            *ilmax = c; *ilmed = a; *ilmin = b;
        }
    } else {
        // idem idem ma scambiando i ruoli di a e b
    }
}
In pratica, cosi` facendo, distingui 8 casi (3 confronti
ognuno dei quali puo` dare 2 risultati = 2 alla 3->8)
di cui due collassano (sapendo c>=a, a>b non ci
occorre piu` confrontare c e b) e dirimi dunque le
6 possibili permutazioni una per una, in modo che
e` chiaramente ottimale: 2 o 3 confronti (di solito
3; la media esatta e` il logaritmo in base 2 di 6!),
tre assegnazioni agli output (chiaramente minimale).
E` proprio perche` questa "funzione" si dovrebbe
ridurre a una decina di istruzioni macchina o giu`
di li`, che e` importante "metterla in linea" invece
che tenerla come funzione -- perche` le almeno
3 o 4 istruzioni di passaggio argomenti, chiamata,
e ritorno, possono avere un peso *importante*
visto il lavoro leggerissimo che la funzione fa.
Il tutto, naturalmente, nell'ipotesi che ti serva
veramente la rapidita` (non ho ben capito a cosa
ti serva questo sort per "la procedura di calcolo
dei lati").
Ah, a proposito: "un poligono con 3 vertici", nella
moderna terminologia tecnica, viene spesso
chiamato "un triangolo"...:-).
Alex

ben maggiori di 3;
[segue una pippa pazzesca]
Grazie a dio ho di meglio da fare, comunque prova a dare un'occhiata di
sfuggita ai sorgenti di Allegro...
Ciao Luciano

sempre funziona. Quando funziona però il disegno viene fatto correttamente.
Cosi' a pelle mi viene in mente:
Prendi uno dei tre numeri e lo confronti con gli altri due.
1-Se uno e' maggiore e l'altro e' il minore sei a posto, sai che quello che
hai scelto e' il medio.
2-Se sono entrambi maggiori o entrambi minori lo poni al terzo o al primo
posto a seconda del caso e confronti gli altri due.
Nel primo caso fai un confronto solo, nel secondo ne fai tre, ma credo sia
il limite minimo. Puo' darsi tuttavia che nella bibliografia sul disegno
vettoriale ci siano metodi migliori.
Ciao!


Proprio volendo stare a guardare per tre numeri ce n'č uno ancora piů rapido
(2 soli confronti)
int ordina(int a, int b, int c)
{
int max;
max =a;
if (b>max)
  max=b;
if (c>max)
  max=c;
return max;
}
ma non credo che fosse la richiesta del primo post.
Ciao Luciano

 int ordina(int a, int b, int c)
Quello che segue potrebbe avere un senso, ma il titolo un po' meno.
In letteratura di algoritmi, esiste una vastita' di trattazione di due
problemi DIVERSI:
algoritmi di SORTING --> ORDINAMENTO
algortimi di SELECT ---> SELEZIONE di 1 elemento (che sia il MAX, il MIN o
			 quello che occupa la posizione n-esima;
la seconda classe di problemi ha soluzioni OVVIAMENTE piu' veloci, si
tratta solo di conoscere un linguaggio (non di programmazione) e cogliere
che
ordinare != selezionare.
P.S. (in riferimento al messaggio di risposta ad Alex Martelli) un po' di
rispetto, per chi risponde alle richieste con un minimo di puntualita'
formale invece che semplificando tutto e troppo. Nessuno ti obbliga a
leggere un messaggio lungo e marcarlo come pippa. Sono ateo, ma rispetta
anche chi crede: Dio si scrive con la maiuscola.
Ciao a tutti, Rony.

Ho bisogno di un algoritmo rapido per l'ordinamento di 3 numeri.
Ho dato una letta veloce hai messaggi che ti sono arrivati come risposta e
penso che se cerchi un algoritmo realmente efficente dovresti fondere alcune
idee che ti sono state date.
Come prima cosa terrei presente che dato che stiamo parlando di pochi
elementi anche io credo non sia assolutamente sensato scomodare il caro è
vecchio qsort, ma sia invece giusto provare a definire e sfruttare tutte le
caratteristiche della situazione.
Primo suggerisco quindi di ordinare in fase di immissione e riducendo i
confronti a quindi un massimo di 3 (totali) cioè:
supponiamo A, B, C e l'ordine corretto quello alfabetico
B>C  detremino la struttura B,C
poi considero A e come puoi ben intuire in questo caso al massimo si
eseguono 2 confronti (totale) per ottenere la struttura A,B,C
Per quanto riguarda il tipo di struttura dati credo, ma questa è una mia
"deviazione" stilistica, adoro i puntatori, dovresti usare una struttura di
tipo lista, che ti permetterebbe di appendere il tuo valore dove ti pare
facendo semplicente variare la zona puntata.
Questo è tutto.
Non ti scrivo codice, perchè non conosco il tuo modo di programmare, ma
l'algoritmo credo che ti sia già sufficiente e poi tu avevi chiesto questo.
Ciao
Gallus

Ciao a tutti, Rony.
Credo che la forma migliore di rispetto per atei, credenti, agnostici e chi
piu' ne ha piu' ne metta, sia di permettere a chiunque di scrivere dio come
gli pare (dato che nella letteratura italiana nessuno piu' si scandalizza se
dio viene scritto con la minuscola).
Ciao a tutti  e scusate ancora se vi ho fatto perdere tempo scrivendo
"sciocchezzuole".
Ciao Luciano