Estoy tratando de ordenar una matriz en orden descendente con la ayuda de qsort
C.
#include<stdio.h>
#include<stdlib.h>
int compareFloat(const void* p1, const void* p2){
const float* pa = p1;
const float* pb = p2;
return pb - pa;
}
int main()
{
float arr[] = {1.5, 1.6, 1.38};
qsort(arr, 3, sizeof(float), compareFloat);
printf("%.2f %.2f %.2f", arr[0], arr[1], arr[2]);
return 0;
}
El resultado del código anterior es "1.60 1.38 1.50", lo cual es incorrecto; pero, cuando la matriz se inicializa como float arr[] = {1.38, 1.6, 1.5}
, la respuesta es correcta (es decir, "1.6, 1.5, 1.38").
¿Por qué?
Solución del problema
En la función de comparación
int compareFloat(const void* p1, const void* p2){
const float* pa = p1;
const float* pb = p2;
return pb - pa;
}
está devolviendo una diferencia de dos punteros. Pero debe comparar los valores señalados en lugar de los punteros en sí.
La función puede verse de la siguiente manera
int compareFloat( const void* p1, const void* p2)
{
float a = *( const float * )p1;
float b = *( const float * )p2;
return ( a < b ) - ( b < a );
}
Aquí hay un programa de demostración.
#include <stdio.h>
#include <stdlib.h>
int compareFloat( const void *p1, const void *p2 )
{
float a = *( const float * )p1;
float b = *( const float * )p2;
return ( a < b ) - ( b < a );
}
int main( void )
{
float arr[] = { 1.5, 1.6, 1.38 };
const size_t N = sizeof( arr ) / sizeof( *arr );
qsort( arr, N, sizeof( float ), compareFloat );
printf( "%.2f %.2f %.2f\n", arr[0], arr[1], arr[2] );
}
La salida del programa es
1.60 1.50 1.38
No hay comentarios.:
Publicar un comentario