2012-05-14 11 views
5

mi problema es el siguiente (es un ejemplo fácil de mostrar el problema):Ordena una matriz basada en los miembros de otra matriz en C++

tengo:

int* array1; 
double* array2. 

array1=new int[10]; 
array2=new double[10]; 
array1=filledWithIntegers(random); 
array2=filledWithDoubles(random); 

// Aquí quiero ordenar array1 en función de los valores de array2. Estoy tratando de usar la función qsort de stdlib. qsort (array1,6, sizeof (int), comparar);

El punto es cómo hacer la función de comparación para el orden array1 basado en array2.

No es posible usar las estructuras de datos de la biblioteca std, se debe hacer directamente en los punteros de la matriz.

Gracias.

Respuesta

5

En lugar de ordenar números enteros de array1, ordenar sus índices usando array2[index] para comparar elementos, y luego volver a organizar array1 de acuerdo con la permutación que regrese de la ordenar.

Aquí es un quick demo:

#include <stdio.h> 
#include <stdlib.h> 

int array1[] = {1, 7, 3, 9, 5}; 
double array2[] = {1.1, 7.7, 3.3, 9.9, 5.5}; 

int compare (const void * a, const void * b) { 
    double diff = array2[*(int*)a] - array2[*(int*)b]; 
    return (0 < diff) - (diff < 0); 
} 

int main(void) { 
    int perm[5], i; 
    int res[5]; 
    for (i = 0 ; i != 5 ; i++) { 
     perm[i] = i; 
    } 
    qsort (perm, 5, sizeof(int), compare); 
    for (i = 0 ; i != 5 ; i++) { 
     res[i] = array1[perm[i]]; 
    } 
    for (i = 0 ; i != 5 ; i++) { 
     printf("%d\n", res[i]); 
    } 
    return 0; 
} 
+1

Casi. 'compare' debería devolver' -1' (en lugar de '0') cuando es más pequeño. – user2k5

+0

@ user2k5 Tiene razón: cambié la función para usar el truco de firma de [esta respuesta] (http://stackoverflow.com/a/4609795/335858). – dasblinkenlight

+0

No necesita una matriz de permutación adicional, simplemente calcule las posiciones de 'a' y' b' dentro de 'array1'. El comparador ya tiene que saber 'array2', de todos modos. –

2

sí. Debe agrupar las dos matrices en una matriz de pares y luego definir la función de comparación.

la función de comparación podría ser:

bool compare(const pair<int,double>& t1, const pair<int,double>& t2){ 
    return (t1.second < t2.second); 
} 
+0

Gracias por la respuesta. Me olvidé de decir que no es posible usar tipos de biblioteca estándar, solo ordenar los valores del puntero de matriz tratando de preservar el formato de los datos – Pau

+0

, entonces ¿podría definir el mapa usted mismo usando struct? – guinny

+0

¿Podría ser que quieres decir 'pair' en lugar de' map'? –

1

Bueno, sólo tiene que utilizar la posición de los elementos a índice de la otra matriz en su función de comparación (las garantías estándar que los argumentos de puntero de la función de comparación siempre punto en la matriz que ser resuelto):

int compare(const void *a, const void *b) 
{ 
    unsigned int i = (const int*)a - array1; 
    unsigned int j = (const int*)b - array1; 
    if(array2[i] < array2[j]) 
     return -1; 
    if(array2[i] > array2[j]) 
     return 1; 
    return 0; 
} 

la desventaja es, que la función de comparación necesita explícitamente a conocer las matrices específicas, ya que no puede tener ningún parámetro adicional.

que cuestionarían el uso de qsort todos modos, ya que su pregunta está etiquetada C++. Aunque std::sort tiene el mismo problema, puede alcanzar mucha más genericidad/abstracción al usar un functor de comparación que encapsula las matrices dependientes.

+0

gracias por tomarse su tiempo para responder, obtuve una solución en una anterior. – Pau

Cuestiones relacionadas