如何在我的快速排序算法中包含 NaN?

Posted

技术标签:

【中文标题】如何在我的快速排序算法中包含 NaN?【英文标题】:How to include a NaN into my Quicksort algorithm? 【发布时间】:2017-03-10 16:07:13 【问题描述】:

以下是我的代码:

#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 没有按应有的方式正确排序,并且我无法将NaN 的两个不同尾数(信号和安静)正确添加到我的代码中作为顶部的字符串。

【问题讨论】:

您确定要/需要支持NaN吗?鉴于它不是一个数字,我不会说它有一个明确的顺序。 “NaN 没有得到正确排序” - 你如何定义“正确”?应该在开头、结尾、中间吗?在无穷大之前还是之后? Why is there a 0 floating point in my Quicksort algorithm list and how to include a NaN into my Quicksort algorithm?的可能重复 您作为两个不同的用户两次问了同一个问题?为什么? 上周您还问了一个几乎相同的问题,将快速排序替换为冒泡排序:***.com/questions/42578497/…。 【参考方案1】:

按照惯例,NaN(字面意思是“非数字”)不能与其他数量进行比较。任何比较都是错误的。 NaN 5 为假。 NaN == NaN 为假。 NaN != NaN 为假。

您所写的比较函数采用相反的方法。它说 NaN 等于任何事物(如果涉及 NaN,则返回零)。快速排序不是一种稳定的排序算法。 qsort 的手册页说:“如果两个成员比较相等,则它们在排序数组中的顺序是未定义的。”

你必须做以下两件事之一:

    使用稳定的排序算法,其中比较相等的项目保证保持其原始顺序。 在比较函数中使用 isnan 函数来识别 NaN,并决定如何处理它们。

您选择哪条路径归结为指定您认为“正确”的行为。

【讨论】:

【参考方案2】:

可能最简单的做法是跳过列表,删除所有 NaN,并记录您找到的数量。然后在列表排序后,将那么多 NaN 附加到排序列表的前面或后面,无论您选择放置 NaN 的任何位置。

【讨论】:

以上是关于如何在我的快速排序算法中包含 NaN?的主要内容,如果未能解决你的问题,请参考以下文章

排序算法 | 快速排序(含C++/Python代码实现)

快速排序到底有多快?(含代码分析9大排序算法并行运行对比视频)

为啥在我的情况下快速排序总是比冒泡排序慢?

我的算法日志:排序算法之快速排序

算法导论习题—排序最坏情况线性时间选择算法小顺序统计量

冒泡排序到快速排序做的那些优化