Pages: [1]   Go Down
Author Topic: ordenar números...  (Read 956 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Full Member
***
Karma: 0
Posts: 189
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas otra vez.....
Estoy atascado... otra vez....

Una de las partes finales de mi programa, me genera una serie de datos... relacionados entre si de dos en dos... y tengo que ordenarlos de mayor a menor.. es decir...

Ejemplo...

dato 1   Dato2
25 ----- 80345
23 ----- 81435
21 ----- 82246
23 ----- 91435
21 ----- 80856
25 ----- 82724

En primer lugar hay que ordenar la columna de dato 1, de mayor a menor... y en caso de repetirse hay que usar el dato dos de menor valor...

es decir....

dato 1   dato 2
25 ----- 80345
25 ----- 82724
23 ----- 81435
23 ----- 91435
21 ----- 80856
21 ----- 82246

tengo guardados los datos guardados de la siguiente manera....
dato1_1, dato1_2 .... dato1_6
dato2_1, dato2_2 .... dato2_6

Alguna idea????

gracias....
Logged

COM22
Offline Offline
God Member
*****
Karma: 6
Posts: 702
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Utilizando un if para compararlos y un for para ir almacenando los resultados en un array.
Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 189
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

pues lo siento....

no consigo hacerlo... llevo 2 horas probando y nada... con dos valores es fácil, pero con mas, no lo consigo....

algún ejemplo por ahi, para echarle un vistazo?...

Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 721
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola,
En C hay hay función para ordenar de forma binaria: qsort()
Puedes definir una estructura con los dos números, y definir una función de comparación. Para recordar cosas que casi las tenía olvidadas, he hecho un ejercicio con tu problema, reducido a 5 números. Espero que te sirva.

Code:
struct numeros
{
   int num1;
   int num2;
} numeros[5];


int compara_numeros( const void *a, const void *b)
{
    struct numeros *n1, *n2;
   n1 = (struct numeros *)a;
   n2 = (struct numeros *)b;
   if(n1->num1 > n2->num1) return 1;
   if(n1->num1 < n2->num1) return -1;
   if(n1->num2 > n2->num2) return 1;   
   if(n1->num2 < n2->num2) return -1;
   return 0;
 };
 
void setup()
{
   Serial.begin(9600);
}


int n;

void loop()
{

   numeros[0].num1 = 33 ;  numeros[0].num2 = 31 ;
   numeros[1].num1 = 4 ;   numeros[1].num2 = 3 ;
   numeros[2].num1 = 111 ; numeros[2].num2 = 222 ;
   numeros[3].num1 = 1 ;   numeros[3].num2 = 3 ;
   numeros[4].num1 = 1 ;   numeros[4].num2 = 2 ;
   
   qsort((void *)numeros, 5, sizeof(numeros[0]), compara_numeros);

   for(n=0;n<5;n++)
   {
       Serial.print(numeros[n].num1); Serial.print("  ");
       Serial.println(numeros[n].num2);
   }
   delay(5555);
}


Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 189
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

MUCHISIMAS GRACIAS!!!!

Funciona perfecto, era justo lo que necesitaba....

No entiendo muy bien como realiza la comparación de los datos (si podrías reescribirlo comentando lo agradecería) pero lo he adaptado y me va de lujo.....


Gracias otra vez.....
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Por dios!. smiley-wink
Hace al menos 7 años que programo en C y siempre tuve que hacer mis propias implementaciones del quicksort().. Nunca supe que habia una funcion generica!. jajaja

Gracias!.
Logged

Pages: [1]   Go Up
Jump to: