Use su regla como la función de comparación de qsort (siempre y cuando B es mayor que A):
#include <stdio.h>
#include <stdlib.h>
int A[] = {0, 1, 4, 5, 7};
int B[]= {5, 3, 8, 2, 2, 7, 1, 6, 3, 9};
int my_cmp(const void *a_, const void *b_,void *arg_)
{
const int *a = a_, *b = b_;
if(B[*a] == B[*b])
return 0;
else if (B[*a] < B[*b])
return -1;
else
return 1;
}
int main(int argc,char *arga[])
{
int i;
qsort(A,sizeof A/sizeof A[0] ,sizeof A[0],my_cmp);
puts("Sorted A");
for(i = 0 ; i < sizeof A/sizeof A[0]; i++) {
printf("A[%d] : %d B[A[%d]] : %d\n",i,A[i],i,B[A[i]]);
}
return 0;
}
Esto da:
$ ./a.out
Sorted A
A[0] : 4 B[A[0]] : 2
A[1] : 1 B[A[1]] : 3
A[2] : 0 B[A[2]] : 5
A[3] : 7 B[A[3]] : 6
A[4] : 5 B[A[4]] : 7
Disponible en muchas plataformas también es qsort_r (en Linux tendrá que #define _GNU_SOURCE
antes de incluir <stdlib.h>
para usarlo. g que cambiaría la función de comparación, por ejemplo,
int my_cmp(const void *a_, const void *b_,void *arg_)
{
const int *a = a_, *b = b_, *arg = arg_;
if(arg[*a] == arg[*b])
return 0;
else if (arg[*a] < arg[*b])
return -1;
else
return 1;
}
Y llama qsort_r como
qsort_r(A,sizeof A/sizeof A[0] ,sizeof A[0],my_cmp,B);
Habrá hacks feos que pueden hacer que esto funcione con qsort, pero creo que es mejor que escribas tu propia versión ... –
@Pavan Preferiría luchar contra zombies en el desierto en lugar de usar mi propio procedimiento de clasificación en producción. – cnicutar
No es un hack feo. Es simplemente que hay una función que mapea el valor de la matriz al orden de clasificación. En este caso, la función puede ser immplementada por una búsqueda de matriz, pero no es un requisito inusual. –