为什么我的Quicksort算法列表中有一个0浮点,以及如何在我的Quicksort算法中包含NaN?

时间:2017-03-10 15:27:34

标签: c++ algorithm quicksort nan

以下是我的代码:

#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的两个不同尾数添加到我的代码中作为字符串在顶部。

2 个答案:

答案 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。