以下是我的代码:
#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;
}
将NaN
添加到数组中,NaN
未按原样正确排序,而且我无法正确添加两个不同的尾数(信号和&#39}安静)将NaN
作为顶部字符串放入我的代码中。
答案 0 :(得分:2)
按照惯例,NaN(字面意思是“不是数字”)与其他数量无法比较。任何比较都是错误的。 NaN&lt; 5是假的。 NaN> 5是假的。 NaN == NaN是假的。 NaN!= NaN是假的。
您所使用的比较函数采用相反的方法。它说NaN等于任何东西和所有东西(如果涉及NaN则返回零)。快速排序不是一种稳定的排序算法。 qsort
的联机帮助页说:“如果两个成员的比较相等,则排序数组中的顺序是未定义的。”
你必须做以下两件事之一:
isnan
功能识别NaN,并决定如何处理它们。您选择的路径归结为指定您认为“正确”的行为。
答案 1 :(得分:0)
最简单的方法可能是通过列表,删除任何NaN,并记录您找到的数量。然后在对列表进行排序后,将多个NaN附加到排序列表的前面或后面,无论您选择放置NaN还是其他任何位置。