Para ordenar vectores, puedes utilizar qsort(), que utiliza el algoritmo quicksort.
Prueba esto:
#include <stdio.h>
#include <stdlib.h>
struct punto {
float x;
float y;
};
void imprime_puntos(struct punto*, int);
int fn_ordena(const void*, const void*);
/*------------------------------------------------*/
int main()
{
struct punto puntitos[] = { {4,6}, {0,1}, {1,7}, {3,3} };
int n_elem;
n_elem = sizeof(puntitos)/sizeof(puntitos[0]);
printf("\nAntes:\n");
imprime_puntos(puntitos, n_elem);
qsort(puntitos, n_elem, sizeof(struct punto), fn_ordena);
printf("\nDespu‚s:\n");
imprime_puntos(puntitos, n_elem);
return 0;
}
/*------------------------------------------------*/
void imprime_puntos(struct punto *p, int n_elem)
{
int i;
for (i = 0; i < n_elem; i++)
printf("x: %5.2f\ty: %5.2f\n", p[i].x, p[i].y);
}
/*------------------------------------------------*/
/*
Esta es la función que ordena el vector.
Debe devolver:
< 0 si 'uno' es menor que 'dos'
== 0 si 'uno' es igual a 'dos'
> 0 si 'uno' es mayor que 'dos'
*/
int fn_ordena(const void *uno, const void *dos)
{
struct punto *p1, *p2;
p1 = (struct punto *)uno;
p2 = (struct punto *)dos;
return (p1->x - p2->x);
}
La función que ordena, devuelve un entero indicando la relación de menor, igual o mayor de los dos elementos que se están comparando.
Como estamos comparando valores float, podríamos tener problemas, ya que el valor de retorno se moldea a int.
Si tenemos el siguiente vector:
struct punto puntitos[] = { {4, 6}, {0.5, 1}, {0.1, 7}, {3, 3} };
verás que no se ordena correctamente, esto es porque 0.5 - 0.1 = 0.4, que al pasarlo a int es 0. Se puede solucionar multiplicando por una potencia de 10 antes de restar. Por ejemplo, si queremos establecer una precisión de centésimas, multiplicamos por 100. Así: 0.5 * 100 - 0.1 * 100 = 50.0 - 10.0 = 40.0 que al pasarlo a int es 40. La comparación quedaría así:
return (100 * p1->x - 100 * p2->x);
un saludo.