GOOGLE ADS

jueves, 21 de abril de 2022

¿Por qué qsort produce una salida diferente para la misma matriz pero en un orden diferente?

Estoy tratando de ordenar una matriz en orden descendente con la ayuda de qsortC.

#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

Flutter: error de rango al acceder a la respuesta JSON

Estoy accediendo a una respuesta JSON con la siguiente estructura. { "fullName": "FirstName LastName", "listings...