以下是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <limits>
#define INFINITY std::numeric_limits<float>::infinity()
#define NEGINFINITY -std::numeric_limits<float>::infinity()
int floatcomp(const void* elem1, const void* elem2)
{
if (*(const float*)elem1 < *(const float*)elem2)
return -1;
return *(const float*)elem1 > *(const float*)elem2;
}
int main()
{
float array[10] = {INFINITY, 3.5f, 144.4f, NAN, 12.4f, NEGINFINITY, 1.4f, -0.0f, 5.9f};
int i;
for (i = 0; i < 10; i++)
printf("%f\n", array[i]);
printf("\n");
qsort(array, 10, sizeof(float), floatcomp);
for (i = 0; i < 10; i++)
printf("%f\n", array[i]);
return 0;
}
快速排序算法按正确顺序对输入的数字进行排序,但列表中始终存在0.00000。
同时在向阵列添加NaN时,NaN未按原样正确排序,并且我无法正确地将NaN的两个不同尾数添加到我的代码中作为字符串在顶部。
答案 0 :(得分:7)
要回答为什么总是包含零,那是因为你声明了一个包含10个元素的数组,但是只用9初始化它,所以第10个为零。
至于NaN,你应该准确解释你对NaN“正确”排序的定义是什么,以及结果与你的预期有何不同。
答案 1 :(得分:3)
使用常规运算符规则来比较双精度数,对包含Nans的列表进行排序在技术上是未定义的行为,因为&lt; b和b&lt; a可能不一致。所以你必须检测Nan并明确地将其设为最高或最低值。
int myisnan(float x)
{
return (x == x) ? 0 : 1;
}
int floatcomp(const void* elem1, const void* elem2)
{
int nan1= myisnan( *(const float *) elem1);
int nan2 = myisnan( *(const float *) elem2);
if(nan1 && nan2)
return 0;
if(nan1 && !nan2)
return -1;
if(!nan1 && nan2)
return 1;
if (*(const float*)elem1 < *(const float*)elem2)
return -1;
return *(const float*)elem1 > *(const float*)elem2;
}
使用&#34; my&#34;用于防止与其他isnan()函数名称冲突的函数,这些函数可能已定义,也可能未定义。 nans彼此不相等,所有操作都返回NaN或false。