Autor Tema: algoritmo para ordenar un vector?  (Leído 6506 veces)

Desconectado netmar

  • Newbie
  • *
  • Mensajes: 2
algoritmo para ordenar un vector?
« en: 03 de Junio de 2004, 06:04:07 pm »
:?
Tengo un vector de estructuras, y cada estructura está formada por 2 campos float: la
“coordenada x” ,y la “coordenada y” que representan un punto del espacio bidimensional.
Mi pregunta es si alguien sabe algun algoritmo para ordenar este vector como fila1,fila2,fila3,...filaN  , considerando la esquina superior izquierda del plano como origen.

Por ejemplo el vector=[{coordenada_x=4,coordenada_y=6}, {coordenada_x=0,coordenada_y=1}, {coordenada_x=1,coordenada_y=7}, {coordenada_x=3,coordenada_y=3}]

deberia convertirse en [{coordenada_x=0,coordenada_y=1}, {coordenada_x=3,coordenada_y=3}, {coordenada_x=1,coordenada_y=7}, {coordenada_x=4,coordenada_y=6}]

Gracias por adelantado.

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
algoritmo para ordenar un vector?
« Respuesta #1 en: 03 de Junio de 2004, 11:12:02 pm »
Para ordenar vectores, puedes utilizar qsort(), que utiliza el algoritmo quicksort.

Prueba esto:
Código: [Seleccionar]
#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:
Código: [Seleccionar]
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í:
Código: [Seleccionar]
return (100 * p1->x - 100 * p2->x);

un saludo.
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado Dabo

  • Administrator
  • *
  • Mensajes: 15348
    • https://www.daboblog.com
algoritmo para ordenar un vector?
« Respuesta #2 en: 04 de Junio de 2004, 01:22:00 am »
bienvenido al foro amigo


alp  :lol:  que bone  8)
Hacking, computing, are in my blood, are a part of me, a part of my life...Debian GNU/Linux rules.

Twitter; https://twitter.com/daboblog
Instagram: @daboblog


www.daboblog.com | www.debianhackers.net | www.caborian.com | www.apachectl.com | www.davidhernandez

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
algoritmo para ordenar un vector?
« Respuesta #3 en: 04 de Junio de 2004, 05:43:12 pm »
...el qsort es el mas rapido que conozco, es muy bueno entre mas desordenados esten los datos...es uyna buena eleccion, pero en que nivel vas???...es que por la pregunta, veo que aun no sabes de los metodos de ordenamiento...bueno sino funciona ya nos dices...mejor dicho si crees que no lo entiendes...por que ALP es un experto...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado BuHo

  • Pro Member
  • ****
  • Mensajes: 733
    • La Estancia Azul
algoritmo para ordenar un vector?
« Respuesta #4 en: 04 de Junio de 2004, 11:05:24 pm »
En algoritmia tienes varios metodos de ordenacion, incluido quicksort,  que como ya te han dicho, es de lo más eficaz que hay. No obstante, te dejo el link.

http://www.algoritmia.net/articles.php?id=31

Está muy  interesante, es lo que estoy haciendo yo ahora mismo en clase.
Wake up BuHo...
Daboweb has you[/color]
Mi blog: La Estancia Azul

Desconectado ALP

  • Member
  • ***
  • Mensajes: 234
algoritmo para ordenar un vector?
« Respuesta #5 en: 05 de Junio de 2004, 02:24:41 am »
Cita de: jirho
...por que ALP es un experto...


no soy ningún experto... simplemente llevo bastantes años programando en C, y  me he pasado muchas horas "peleando" con estas cosas.... si yo hubiera tenido internet antes....
Si no puedes deslumbrar con tu sabiduría, desconcierta con tus gilipolleces.

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
algoritmo para ordenar un vector?
« Respuesta #6 en: 11 de Junio de 2004, 05:17:30 pm »
...no amigo nada de eso...sabes bastante y eso hay que respetarlo...por otro lado... :evil: si yo tuviewra internet ahora... :evil: ... :wink: ...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

Desconectado fg

  • Junior Member
  • **
  • Mensajes: 65
    • http://www.inforsist.net
algoritmo para ordenar un vector?
« Respuesta #7 en: 16 de Junio de 2004, 01:21:35 am »
http://inforsist.net/apuntes.php

Ahí tienes unos apuntes de métodos de ordenación, explicados con ejemplos. Espero que te sirvan.

Saludos!

Desconectado jirho

  • Member
  • ***
  • Mensajes: 303
algoritmo para ordenar un vector?
« Respuesta #8 en: 16 de Junio de 2004, 11:39:07 pm »
...saludos y bienvenido fg...gracias por los apuntes...
[root@local_host jirho]#Conecting to underground zone...:superman:

http://www.hackeando.com/gifs/logomini.gif

 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License